ES6中新增加了let关键字来定义变量,它的用法与var相似,同时,ES6也对块级作用域进行了完善,这使得let与var在使用上出现了不同的特性。下面将会一一分析学习。
0x01.块级作用域
ES6规定了一组大括号{}之前的区域为块级作用域,使用let关键字定义的变量作用域受块级作用域限制,而使用var关键字定义的变量则不受块级作用域影响,下面代码段中,在大括号外部依旧可以访问var定义的a变量而无法访问let定义的b变量。
{
var a = 1;
let b = 2;
}
console.log(a); // 1
console.log(b); // b is not defined
0x02.let关键字不会变量提升
使用let定义的变量在解释器执行的过程中不会进行变量提升,从而不能在变量定义之前使用,下面代码段中var定义的变量a由于解释器在执行过程中进行了变量提升从而不会报错,而使用let定义的变量b不会被变量提升,所以解释器在执行的过程中给出了b is not defined的错误信息。
console.log(a); // undefined
console.log(b); // Error: b is not defined
var a = 1;
let b = 2;
上述代码变量提升后的真实逻辑如下面代码段所示,更多变量提升知识,请点击查看。
// 变量提升将var定义的变量置为当前作用域最前端
var a;
console.log(a); // 此时a已经被声明,但没有具体值。
console.log(b); // 此时b没有被声明。
a = 1;
let b = 2;
0x03.不可以重复声明
使用var定义的变量在重复声明时解释器不会给出错误信息,后赋给变量的值会替换之前变量的值。
var a = 1;
var a = 'test';
console.log(a); // 'test'
var b = 2;
var b;
console.log(b); // 2
let关键字不允许重复声明同一变量,解释器会给出错误信息:Uncaught SyntaxError:Identifier 'variable' has already been declared,告知用户出现语法错误,变量已经被定义。
let a = 1;
let a = 'test'; // Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(a);
0x04.不会给window对象增加属性
在全局作用域下,使用var关键字和function关键定义的变量和方法将会被作为全局对象window的属性,而使用let关键字定义的变量将不会作为全局对象window的属性,下面代码段中可以看出var定义的a变量和function定义的getA方法添加到了window的属性中,而let定义的变量b则没有被添加。
var a = 123;
function getA() {
console.log(a);
}
let b = 321;
console.log(window.a); // 123
console.log(window.getA); // function getA(){ console.log(a); }
console.log(window.b); // undefined
还可以使用in关键字来测试结论:
var a = 123;
function getA() {
console.log(a);
}
let b = 321;
console.log('a' in window); // true
console.log('getA' in window); // true
console.log('b' in window); // false
0x05.总结
以上就是在学习ECMAScript的过程中所了解到的let的初级的知识,有待补充和完善,如在叙述中存在问题,还请不吝赐教,指出问题所在。