ES6
介绍Let
附带的变量block level scoping
。直到ES5
我们没有了block level scoping
,所以在块内声明的变量始终处于hoisted
函数级作用域。
基本上Scope
是指变量在程序中的可见位置,它决定了允许在何处使用已声明的变量。在ES5
中global scope,function scope and try/catch scope
,ES6
我们还使用Let来获得块级别作用域。
- 当您使用
var
关键字定义变量时,从定义函数起就知道整个函数。
当您使用let
语句定义变量时,仅在定义的块中知道该变量。
function doSomething(arr){
//i is known here but undefined
//j is not known here
console.log(i);
console.log(j);
for(var i=0; i<arr.length; i++){
//i is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
for(let j=0; j<arr.length; j++){
//j is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
}
doSomething(["Thalaivar", "Vinoth", "Kabali", "Dinesh"]);
如果您运行代码,则可以看到该变量j
仅在中已知,而在此loop
之前和之后都不知道。但是,从定义变量的那一刻起,我们i
就知道entire function
它了。
使用let的另一个好处是,它创建了新的词汇环境,并且绑定了新的值,而不是保留旧的引用。
for(var i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
for(let i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
第一个for
循环始终打印最后一个值,并let
创建一个新的作用域并绑定新值以打印us 1, 2, 3, 4, 5
。
来到constants
,它基本上像一样工作let
,唯一的区别是它们的值无法更改。在常量中,允许突变,但不允许重新分配。
const foo = {};
foo.bar = 42;
console.log(foo.bar); //works
const name = []
name.push("Vinoth");
console.log(name); //works
const age = 100;
age = 20; //Throws Uncaught TypeError: Assignment to constant variable.
console.log(age);
如果常量引用object
,则它将始终引用,object
但是其object
本身可以更改(如果它是可变的)。如果您想拥有一个不变的东西object
,可以使用Object.freeze([])
let foo = () => bar; let bar = 'bar'; foo();
说明可以更好地说明所有声明的提升效果,因为由于暂时的死区而导致的效果不明显。