首先就是let只在定义的区块中有效;在区块以外无效;同样let无声明提升;
{
let a=0;
var b=1;
};
console.log(a);//报错;
console.log(b);1;
for循环最适合使用let;
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a6; // 10
代码从上到下执行;var i;相当于全局就一个i;代码从上到下执行;最终执行完成后i就是10;
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a6; // 6
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
for后面的()是一个作用域;内部循环是一个作用域;
上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。
- 不存在变量提升;也就是会出现暂时性死区;不允许全局定义;在函数的内部的默认的方法;存在
为什么需要块级作用域;
首先内部变量会覆盖外部变量;
var tmp=new Date();
function f(){
console.log(tmp);
if(false){
var tmp='hello world';
}
};
f();//undefined;
因为var 存在变量提升;导致内层的变量tmp被从新定义;一个{};就是一个区块;也就是块级作用域;
let实际上为JavaScript增加了块级作用域;
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
网友评论