细说 let 与 var 的不同之处

来源:互联网 发布:wifi免费打电话软件 编辑:程序博客网 时间:2024/06/03 07:07

细说 let 与 var 的不同之处

最近看了阮一峰大大的《es6 标准入门》,感觉写的很详细,今天就给各位读者老爷们详细的说一下 let 与 var的不同之处,有不严谨的地方还请多多指教

基本用法

    {        let a = 10;        var b = 20;    }    console.log(a) // undefined    console.log(b) // 20

在代码块中用 let 和 var 分辨定义了 a 和 b 两个变量,但是在代码块外面调用这两个变量,a 返回undefined,b返回正确的值,这就表明了

let 声明的变量只在其所在的代码块中有效

再来一个例子

    for(let i = 0;i < 9;i++){        setTimeout(function(){            console.log(i) // 0~8        },1000);    }    for(var i = 0;i < 9;i++){        setTimeout(function(){            console.log(i) // 9个9        },1000);    }

在这段代码中,用 let 的 for 循环最终打印出来的是 0~8;而用 var 的 for 循环最终打印出来的是 9 个 9。

这就是说明了 let 声明的变量 i 只在本轮循环有效,所以每一次的 i 都是一个新的变量,并不会覆盖上一次循环出来的 i ;而 var 声明的变量在每一次循环 i 都会被新的 i 值所覆盖,最终打印出来的是 9 个 9.

先声明再使用

let 并不像 var 那样会存在“变量提升”的现象,所以一定要先声明之后再使用,否则会报错的;
例如:

    console.log(a)  // ReferenceError    let a = 222; 

还有一种

    var a = 222;    if (true) {        a = 666;        let a;    }    console.log(a);  // ReferenceError: a is not defined

上面的代码中存在着全局变量 a ,但是在 if 这个作用域内 let 又声明了一个局部变量 a ,导致了 a 绑定了 if 这个作用域,所以调用 a 的话会报错。

ES6 明确规定,如果区块中存在 let 和 const 命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。只要在声明之前使用这些变量,就会报错。

还有一种情况,比较隐蔽,例如:

    function test1(x = y;y = 222){        return [x,y];    }    test1(); // 报错    function test2(x = 222;y = x){        return [x,y];    }    test2(); // [222,222]

所以,let 一定要先声明变量在使用

不允许重复声明

let 跟 var 不同,在同一个作用域内,var 可以重复声明同一个变量,但是 let 是不允许的。

下面这几种情况都是不被允许的:

    function fun1(){        let a = 10;        var a = 20;   // 报错    }       function fun2(){        let b = 10;        let b = 20;   // 报错    }    function fun3(a){        let a = 10;   // 报错    }

let 不允许在相同作用于内重复声明同一个变量,而且不能在函数内部重新声明参数

下面这种情况可以:

    function fun(a){        {            let a = 10;        }    }

关于 let 和 var 之间的一些小小区别暂时就到这里了,再次感谢阮一峰大大的《ES6标准入门》,有不严谨的地方欢迎各位读者老爷们指正。