关于ES6的块级作用域

在ES5中是没有块级作用域的,只有全局作用域与局部作用域(函数作用域);

怎么理解没有块级作用域呢?看接下来的例子:

for (var i = 0; i < 5; i++) {
        {
            console.log(i) //输出0,1,2,3,4
        }
    }
console.log(i)  //输出5 

用var声明变量,变量i会被泄露为全局变量,使得在任何地方i都能够被读取。
for (let i = 0; i < 5; i++) {
        {
            console.log(i) //输出0,1,2,3,4
        }
    }
console.log(i)  //输出Uncaught ReferenceError: i is not defined 

而用let声明的变量,只在该作用域内有效,在外则无法读取。

在编写代码时很容易会遇到变量提升造成变量泄露成全局变量,而且浏览器不会报错,只是悄悄地把你某一个值改掉,使得纠错时会比较麻烦,而ES6的块级作用域很方便的解决了这个问题,看这段代码:

  function f() {
        var n = 1;
        if (true) {
            var n = 2;
function f() {
        let n = 1;
        if (true) {
            let n = 2;
            if (true) {
                let n = 3;
                console.log(n) //输出1
            }
            console.log(n) //输出2
        }
        console.log(n) //输出3
    }

if (true) { var n = 3; console.log(n) //输出3 } console.log(n) //输出3 } console.log(n) //输出3 }

变量被覆盖了;

如果将var 改为let :


由于形成块级作用域,只输出各自作用域内声明的n。

块级作用域的出现很好的解决了变量覆盖以及变量泄露的问题。

有关于let与const的块级作用域的问题,可以去看阮一峰老师写的书,非常详细:http://es6.ruanyifeng.com/

猜你喜欢

转载自blog.csdn.net/linxner/article/details/80183040