es6

基本语法

{
 let a = 10;
 var b = 1;
}
b // 1
a // ReferenceError: a is not defined.

在代码块中声明了a,b。然后a is not defined.这是因为let命令只在对应的代码块中有效,我们在外部去引用它,就会报错。这就是let的块级作用域的效果,如果不太清楚什么是块级作用域。我们来看下面的例子。

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

i在for循环中定义的是全局变量。我们在调用函数时。函数内部的i引用的是全局的i,所以打印出来的 是10. 我们之前是这样解决的

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

使用了立即执行函数将i的值传入了内部的函数,这样内部的函数就能够获取到对应的i。

我们用let来代替var,最后输出的是 6。

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

因为我们每一次的循环都生成了一个新的块级作用域,内部保存着i的值,所以就会打印出6.

let不存在变量提升

   console.log(a);
   console.log(b);
   var a=0;//undefined
   let b=0;//ReferenceError: b is not defined

TDZ(暂时性死区) let命令在块级作用域中,即使不存在变量提升,它也会影响当前块级作用域,即绑定在了当前作用域。在作用域中引用外部的变量将会报错。

 var a=10;
  {
      console.log(a);  //ReferenceError: a is not defined
      let a=10;
  }

 

posted @ 2018-08-14 09:27  小杜要加油  阅读(152)  评论(0编辑  收藏  举报