一、let
1、let命令
用法类似于var,但是它所声明的变量,只在let命令所在的代码块内有效。
如下代码,是个大坑,因为i被认为是全局变量,输出10
var a = [];
for (var i = 0; i < 10 ; i++) {
a[i] = function() {
console.log(i);
}
}
a[6]();
原因: 变量i是var命令声明的,在全局范围内都有效,所以a[i]都指向同一个对象
疑点:
1、 i为什么不是9? 测试了下,因为a[i]是个function,最后i=9时又做了++,所以是10
把var 改成let之后,就正常了,因为let让i变成了for里面的局部变量
2、 let要求先定义后使用
否则报“ ReferenceError”
3、隐蔽的误区
如下代码,因为y未被先定义
function bar(x = y, y = 2) {
return [x, y];
}
bar(); // 报错
4、let不允许在相同作用域内,重复声明同一个变量。
5、块级作用域
二、const
1、 常量的意义:指针地址不变
const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
2、实现真的const
如果真的想将对象冻结,应该使用Object.freeze方法
const foo = Object.freeze({});
// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;
三、一些总结
1、 用let和const定义的变量,不再属于全局对象(window或global)
var a = 1;
console.log(window.a);
let b = 1;
console.log(window.b);
网友评论