let与for

正常的var与for:

var a = [];
for (var i = 0; i < 10; i++) {
    a[i] = function () {
        console.log(i);
    };
}
a[6](); // 10

let与for:

var a = [];
for (let i = 0; i < 10; i++) {
    a[i] = function () {
        console.log(i);
    };
}
a[6](); // 6

var和for一起使用的时候,变量只有一个,不存在作用域,但是let和for一起使用的时候,实际上就有两层作用域,for小括号里面的为外层作用域,大括号内为内层作用域。结构大致如下:

{
    let i = 0; // i作用于这个大区块
    {
        //let i = 'abc'; // i作用于这个小区块
        console.log(i);
    }
}

这种结构,如果内层用let重新定义一个i也是没关系的:

for (let i = 0; i < 10; i++) {
    let i='a';
    console.log(i);
}

注意,这里内部用let定义是可以的,因为let是以大括号为作用域的,如果使用var就会报错,因为var会先将变量提升,然后let这里就会报变量已存在的错误。

//注意,这是错误的代码,因为var会先将i提升,然后let报错
for (let i = 0; i < 10; i++) {
    var i='a';
    console.log(i);
}

这种错误情况的结构大致如下:

{
    let i = 0; // i作用于这个大区块
    {
        var i = 'abc'; // 此处的i也作用于这个大区块
        console.log(i);
    }
}

暂时性死区

let/const变量在定义前不能被使用:

//情况1
typeof x; // ReferenceError
let x;
//情况2
console.log(y);// ReferenceError
let y;
//情况3
let x=x;// ReferenceError
//情况4
function bar(x=y,y=2){}
bar();//报错

注意上面的bar(x=y,y=2){},参数上的声明用的其实是let,因为y在声明前使用了,所以报错。

变量声明

相同作用域下,let声明后,不能再用let和var声明,但是可以直接声明,例如let a=10;a=20;是可以的。

回到顶部
我要评论

所有评论

返回
邮箱:
绑定
取消
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

邮箱:
绑定邮箱后,若有回复,会邮件通知。
提交
还可以输入500个字