1、let关键字
1.1、var 和 let 关键字之间的差异
使用 var 关键字来声明变量,会出现重复声明导致变量被覆盖却不会报错的问题。
let 是在代码块内有效,var 是在全局范围内有效
var camper = 'James';
var camper = 'David';
console.log(camper);
1.2、var 和 let 关键字的作用域
- 使用 var 关键字来声明一个变量的时候,这个变量会被声明成全局变量,或是函数内的局部变量
- let 关键字的作用与此类似,但会有一些额外的特性。 如果在代码块、语句或表达式中使用关键字 let 声明变量,这个变量的作用域就被限制在当前的代码块、语句或表达式之中
1.2.1、
存储的函数会总是指向更新后的全局 i 变量的值
var printNumTwo;
for (var i = 0; i < 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
console.log(printNumTwo());
console.log(i);
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10
1.2.2、
let printNumTwo;
for (let i = 0; i < 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
console.log(printNumTwo());
console.log(i);
i 未定义,因为它没有在全局范围内声明。 它只在 for 循环语句中被声明。 printNumTwo() 返回了正确的值,因为 let 关键字在循环语句中使 i 变量产生了三个不同的值(分别为 0、1、2)
1.3、变量提升
1.3.1、let 不存在变量提升
变量 a 用 let 声明不存在变量提升,在声明变量 a 之前,a 不存在,所以会报错
1.3.2、var 会变量提升
变量 b 用 var 声明存在变量提升,所以当脚本开始运行的时候,b 已经存在了,但是还没有赋值,所以会输出 undefined。
2、const 常量
const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。通过 const 声明的变量只能被赋值一次,而不能被再次赋值。
2.1、声明
对所有常量的命名采用全大写字母,并在单词之间使用下划线进行分隔
2.2、暂时性死区:
var PI = "a";
if(true){
console.log(PI); // ReferenceError: PI is not defined
const PI = "3.1415926";
}
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。
2.3可改变但是不能重新赋值
在使用 const 声明的时候依然是可变的。 使用 const 来声明只会保证变量不会被重新赋值
和所有数组一样,数组 s 中的元素是可以被改变的,但是因为使用了 const 关键字,不能使用赋值操作符将变量标识 s 指向另外一个数组。
2.4、const 原理
const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。简单类型和复合类型保存值的方式是不同的。是的,对于简单类型(数值 number、字符串 string 、布尔值 boolean),值就保存在变量指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。而复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针,所以 const 只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了,所以使用 const 声明复杂类型对象时要慎重。
2.5、 Object.freeze
当一个对象被冻结的时候,不能再对它的属性再进行增、删、改的操作。 任何试图改变对象的操作都会被阻止,却不会报错
let obj = {
name:"Jack",
review:"Awesome"
};
Object.freeze(obj);
obj.review = "bad";
obj.newProp = "Test";
console.log(obj);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。