25 JavaScript学习:var let const

JavaScript全局变量

在这里插入图片描述

JavaScript中全局变量存在多种情况和定义方式,下面详细解释并提供相应的举例:

  1. 使用var关键字声明的全局变量:

    var globalVar = "我是全局变量";
    
  2. 未使用var关键字声明的变量会成为全局变量(不推荐使用):

    anotherGlobalVar = "我也是全局变量";
    
  3. 在全局作用域中声明的函数也是全局变量:

    function globalFunction() {console.log("我是全局函数");
    }
    
  4. 全局对象(window)上直接定义的属性也会成为全局变量:

    window.globalProperty = "我是全局对象的属性";
    
  5. ES6之前没有块级作用域概念,因此在if语句、for循环等代码块中声明的变量,如果没有使用var,也会成为全局变量:

    if (true) {blockScopedVar = "我在if块中声明,但成为了全局变量";
    }
    

需要注意全局变量可能带来的问题,如命名冲突和不可预测的值改变。因此,在编程中应当尽量避免滥用全局变量,可以使用IIFE(立即调用函数表达式)或者ES6的模块化语法,来封装变量,减少全局污染的风险。

JavaScript局部变量

在这里插入图片描述

JavaScript中的局部变量是指在函数内部或代码块内部声明的变量,只能在其所属的函数或代码块内部访问。以下是 JavaScript 中局部变量的各种情况详解和举例:

  1. 使用关键字 varletconst 在函数内部声明的变量为局部变量:
function localVariableExample() {var localVar = "我是局部变量";let anotherLocalVar = "我也是局部变量";const constVar = "我是一个常量局部变量";// 在这个函数内可以访问 localVar、anotherLocalVar 和 constVar
}
  1. 使用 function 关键字声明的函数内部的参数也是局部变量:
function myFunction(param) {// 这里的 param 是局部变量
}
  1. ES6 的箭头函数的参数也是局部变量:
const myArrowFunction = (param) => {// 这里的 param 是局部变量
};
  1. 在代码块内(ES6引入了块级作用域)使用 letconst 关键字声明的变量也是局部变量:
if (true) {let blockScopedVar = "我是块级作用域的局部变量";const anotherBlockScopedVar = "我也是块级作用域的局部变量";// 只能在 if 代码块内访问 blockScopedVar 和 anotherBlockScopedVar
}

局部变量只在其所属的函数或代码块内部可见,出了这个范围就无法访问。这种限制有助于避免命名冲突和提高代码的可维护性。

JavaScript块级作用域

JavaScript在ES6中引入了块级作用域,允许使用letconst声明变量,这些变量的作用域仅限于包含它们的代码块内部。

下面是关于块级作用域的详细说明和举例:

  1. 使用let声明的变量:
{let x = 2;console.log(x); // 输出 2
}
console.log(x); // 报错,因为x在块级作用域外部不可见
  1. 使用const声明的常量也具有块级作用域:
{const PI = 3.14;console.log(PI); // 输出 3.14
}
console.log(PI); // 报错,因为PI在块级作用域外部不可见
  1. for循环中的块级作用域:
for (let i = 0; i < 3; i++) {console.log(i); // 输出 0, 1, 2
}
console.log(i); // 报错,因为i在for循环中具有块级作用域,超出循环后不可见

块级作用域可在代码中更好地控制变量的作用范围,避免变量提升和命名冲突等问题。这种特性在编写复杂的JavaScript程序时尤其有用。

JavaScript重新定义变量

在JavaScript中,使用let关键字可以重新定义变量,而使用var关键字则不能。重新定义变量指的是在同一作用域内多次声明同一个变量名,后面的声明将覆盖前面的声明。

下面分别以letvar来说明重新定义变量的情况:

  1. 使用let重新定义变量:
let x = 10;
console.log(x); // 输出 10
let x = 20; // 可以重新定义x,不会报错
console.log(x); // 输出 20

在使用let声明变量时,可以在同一作用域内多次声明同一个变量名,后面的声明会覆盖前面的声明。

  1. 使用var重新定义变量:
var y = 30;
console.log(y); // 输出 30
var y = 40; // 重新定义y,不会报错
console.log(y); // 输出 40

在使用var声明变量时,由于var存在变量提升的特性,重新定义变量也是有效的,后面的声明会覆盖前面的声明。

总结来说,使用letvar都可以进行变量的重新定义,但建议在ES6及以后的代码中使用letconst来声明变量,以避免变量提升等问题,并更好地控制作用域。

JavaScript循环作用域

在 JavaScript 中,循环并不会创建新的作用域,这意味着在使用 var 声明变量时,循环体内部声明的变量会被提升到循环外部的作用域中。这可能导致意外的行为,特别是在使用异步操作时。

举例来说:

for (var i = 0; i < 3; i++) {setTimeout(function() {console.log(i);}, 100);
}

在上面的例子中,当 setTimeout 回调执行时,它会打印出 3,而不是预期的 0、1 和 2。这是因为 i 变量在循环内部被提升到了循环外部的作用域,以至于所有的 setTimeout 共享同一个 i 变量,并且在循环结束后才被赋值为 3。

为了避免这个问题,可以使用 letconst 声明变量,因为它们会在每次迭代中创建一个新的变量实例,从而解决了作用域共享的问题。

for (let i = 0; i < 3; i++) {setTimeout(function() {console.log(i);}, 100);
}

在这个例子中,每个 setTimeout 回调都会引用一个独立的 i 变量,因此会按照预期打印出 0、1 和 2。

HTML 代码中使用全局变量

在 HTML 中定义全局变量的方式如下:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>使用全局变量</title></head><body><script>// 在 script 标签内部定义全局变量var globalVar = "Hello World!";function sayHello() {alert(globalVar);}</script><button onclick="sayHello()">Click me</button></body>
</html>

在上面的例子中,通过在 <script> 标签内部定义一个全局变量 globalVar 和一个函数 sayHello。当按钮被点击时,会调用 sayHello 函数来弹出全局变量 globalVar 的值。

在实际情况中,很少有必要在 HTML 中定义全局变量。通常,全局变量应该在 JavaScript 文件中定义,而不是嵌入到 HTML 中。可以使用 <script src="path/to/file.js"></script> 语法从 HTML 文件中链接到 JavaScript 文件,并在 JavaScript 文件中定义全局变量。例如:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>使用全局变量</title></head><body><script src="global.js"></script><button onclick="sayHello()">Click me</button></body>
</html>

global.js 文件中定义全局变量和函数:

var globalVar = "Hello World!";function sayHello() {alert(globalVar);
}

这样做的好处是,将 JavaScript 代码与 HTML 文件分离开来,使代码更易于管理和维护。

const 关键字

const 是 JavaScript 中用来声明常量的关键字。使用 const 声明的变量必须进行初始化,并且一旦被赋值后就不能再被修改。这意味着 const 声明的变量是不可变的。例如:

const PI = 3.14159;

在这个例子中,PI 被赋值为 3.14159,并且不能再被改变。

与 var 和 let 不同,const 声明的作用域为块级作用域,而不是函数作用域。也就是说,在使用 const 声明的变量只在其声明所在的块内部有效。

另外需要注意的是,虽然 const 声明的变量不可修改,但如果 const 声明的变量是一个对象,那么对象的属性是可以修改的。例如:

const person = {name: 'Alice',age: 30
};// 对象的属性可以修改,但是不能重新赋值给person
person.age = 31;

总结一下,const 关键字用于声明不可变的常量,常用于声明不会被修改的值,以及避免意外的变量重复赋值。

const并非真正的常量

在 JavaScript 中,使用 const 关键字声明的变量被称为常量,因为它们在初始化后不可被重新赋值。这意味着一旦使用 const 声明变量并赋予初值后,就不能再对其进行重新赋值。

例如:

const PI = 3.14159;
PI = 3.14; // 这行代码会导致错误,因为常量PI不能被重新赋值

虽然 const 声明的变量本身是不可变的,但若该变量是一个对象,那么对象的属性是可以修改的。这意味着虽然不能给该变量赋予新的值,但仍然可以修改其属性。

例如:

const person = {name: 'Alice',age: 30
};person.age = 31; // 这里修改了对象属性,不会导致错误

因此,虽然 const 声明的变量并非完全不可变,但通过 const 声明的变量确实可以在保证不被重复赋值的情况下,允许对对象属性进行修改。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【御控物联网平台】物联网数据传输数据格式

物联网平台常用设备消息的标准数据格式为JSON&#xff0c;但是不同厂家、不同型号设备数据传输格式各异&#xff0c;给物联网平台带来数据解析的压力。御控物联网平台提供支持JSON数据消息解析功能的代码库&#xff08;JS、Java、.Net&#xff09;&#xff0c;实现设备自定义JS…

八大排序详解:动图、代码、注释

目录 何为八大排序&#xff1f; 直接插入排序 排序过程解读 直接插入排序的特性总结&#xff1a; 希尔排序 希尔排序的特性总结&#xff1a; 直接选择排序 直接选择排序的特性总结&#xff1a; 堆排序 直接选择排序的特性总结&#xff1a; 冒泡排序 快速排序 1.Hoa…

初学React基础

最近准备跟着黑马React学一下React&#xff0c;扩充一下技术面&#xff0c;打算还是以一边学习一边记笔记为主&#xff0c;进行学习&#xff01; 1. React介绍 1.1. React是什么&#xff1f; React是由FaceBook现在称&#xff08;Meta&#xff09;开发的开源 JavaScript 库&a…

【leetcode】数组和相关题目总结

1. 两数之和 直接利用hashmap存储值和对于索引&#xff0c;利用target-nums[i]去哈希表里找对应数值。返回下标。 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> mp;vector<int> res;fo…

【linux】进程间通信(匿名管道)

对于本篇文章我们采取三段论&#xff1a;是什么 为什么 怎么办。 目录 进程间为什么要通信&#xff1f;进程间如何通信&#xff1f;进程间怎么通信&#xff1f;匿名管道&#xff1a;匿名管道原理&#xff1a;代码示例&#xff1a;匿名管道的情况与特征&#xff1a; 进程间为什…

win下vscode的vim切换模式的中英文切换

问题描述 在vscode中安装vim插件后&#xff0c;如果insert模式下完成输入后&#xff0c;在中文输入方式下按esc会发生无效输入&#xff0c;需要手动切换到英文。 解决方法 下载完成vscode并在其中配置vim插件下载github—im-select.exe插件&#xff08;注意很多博文中的gitcod…

【MySQL篇】使用mysqldump全量+mysqlbinlog增量完成实例的全库恢复(第四篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

每天五分钟深度学习框架pytorch:如何创建多维Tensor张量元素?

本文重点 上节课程我们学习了如何创建Tensor标量,我们使用torch.tensor。本节课程我们学习如何创建Tensor向量,我们即可以使用torch.Tensor又可以使用torch.tensor,下面我们看一下二者的共同点和不同点。 Tensor张量 tensor张量是一个多维数组,零维就是一个点(就是上一…

【数据结构】链表专题3

前言 本篇博客我们继续来讨论链表专题&#xff0c;今天的链表算法题是经典中的经典 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 1.判断链表是否…

ROS1快速入门学习笔记 - 014launch启动文件的使用方法

一、定义 Launch文件&#xff1a;通过XML文件实现多节点的配置和启动&#xff08;可自动启动ROSMaster&#xff09; 二、常用语法 1. 根标签 <launch> - launch文件中的根元素采用<launch>标签定义 <launch>表示开始&#xff1b;<launch>表示结束&…

AD | Altium Designer(原理图设计、电路仿真、PCB绘图)汉化版

Altium Designer(原理图设计、电路仿真、PCB绘图) 通知公告 Altium Designer(AD)是一种功能强大的电子设计自动化(EDA)软件。它主要用于设计和开发电子产品,如电路板(PCB)、集成电路(IC)和嵌入式系统。AD提供了完整的设计工具套件,包括原理图设计、PCB布局、仿真、设…

40.WEB渗透测试-信息收集-域名、指纹收集(2)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;39.WEB渗透测试-信息收集-域名、指纹收集&#xff08;1&#xff09; oneforall的安装前置…

基于粒子滤波器的电池剩余使用寿命计算matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 粒子滤波器基础 4.2 电池剩余使用寿命建模与预测 4.3 粒子滤波器在电池寿命预测中的应用 5.完整工程文件 1.课题概述 基于粒子滤波器的电池剩余使用寿命计算。根据已知的数据&#xff0c;预测未来…

OPPO A72/A55/K7X/A53真我Q3S等手机ROOT刷机后广电卡没信号不读卡解决办法

目前运营商除了移动联通电信以外&#xff0c;还存在1个中国广电&#xff0c;广电属于第四大运营商&#xff0c;由于广电起步较晚&#xff0c;对于手机频段要求也自然不一样&#xff0c;导致目前市面上部分手机出厂没有信号或者不读卡等问题&#xff0c;特别在手机被用户自行刷机…

二叉树的遍历算法

目录 1.二叉树结构 2.广度优先搜索二叉树&#xff08;迭代算法&#xff09; 3.深度优先搜索二叉树&#xff08;递归算法&#xff09; 1.二叉树结构 一个父结点&#xff0c;至多可以连接左右两个子节点 Java构造树结构——其实是 自定义树结点类型 public class TreeNode {in…

信号,信号列表,信号产生方式,信号处理方式

什么是信号 信号在我们的生活中非常常见&#xff1b;如红绿灯&#xff0c;下课铃&#xff0c;游戏团战信号&#xff0c;这些都是信号&#xff1b;信号用来提示接收信号者行动&#xff0c;但接收信号的人接收到信号会进行一系列的行为&#xff0c;完成某个动作&#xff1b;这就…

cmake的使用方法: 多个源文件的编译

一. 简介 前面一篇文章学习了针对只有一个 .c源文件&#xff0c;如何编写 CMakeLists.txt内容&#xff0c;从而使用 cmake工具如何编译工程。文章如下&#xff1a; cmake的使用方法: 单个源文件的编译-CSDN博客 本文学习针对 多个 .c源文件&#xff0c; CMakeLists.txt文件如…

融创共赢,算网领航 | 移动云智能芯片开放实验室正式发布

4月29日上午&#xff0c;中国移动算力网络大会“融创共赢&#xff0c;算网领航-算网原生技术”分论坛在苏州金鸡湖国际会议中心顺利召开&#xff0c;中国移动云能力中心副总经理吴世俊出席论坛并发表致辞。大会举行了智能芯片开放实验室发布仪式&#xff0c;同时发布移动云最新…

CogAgent:开创性的VLM在GUI理解和自动化任务中的突破

尽管LLMs如ChatGPT在撰写电子邮件等任务上能够提供帮助&#xff0c;它们在理解和与GUIs交互方面存在挑战&#xff0c;这限制了它们在提高自动化水平方面的潜力。数字世界中的自主代理是许多现代人梦寐以求的理想助手。这些代理能够根据用户输入的任务描述自动完成如在线预订票务…

【模板】前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和模板题。 前缀和中数组下标为1~n。 前缀和&#xff1a;pre[i]pre[i-1]a[i]; 某段区间 [l,r]的和&#xff1a;pre[r]-pre[l-1] 3.…