ES6 之关键字 let

1、 关键字 let

正如你们都熟悉的,咱们平时在写代码的时候,用var 声明一个变量,除此以外,也再没有接触到其它的关键字了,无论咱们声明什么样类型得变量,都用var 搞定了,很方便,可是ES6 告诉你,除了var,还能够试试 let 来声明变量。数组

那么,既然var 方便,为何还要let 来声明,这么说 var 声明 必定会有不足的地方。函数

下面介绍 用 var 的不足之处。

1.先看一段代码
var arr = [ ];
for(var i=0;  i<10;  i++){
    arr [i] = function(){
         alert(i)
    }
}
arr [1](); //结果:10
很明显,咱们执行这段代码的想要的结果是弹出arr 这个数组对应索引的值。但发现不管索引是几 弹出结果都是10。
Why ?
继续执行这段代码看看:
var arr = [ ];
for(let i=0;  i<10;  i++){
    arr[i] = function(){
         alert(i)
    }
}
arr[1](); //结果:1
竟然弹出了对应索引的值!对比一下两段代码,惟一的不一样之处就是循环的时候初始化变量 i 是使用let,而不是用var, Why ? ?
原来,let声明的变量仅仅在本身使用的块级做用域起做用,出了这个块级做用域就不起做用了。
注意:块级做用域 即任何一对花括号中的语句都属于一个快,在花括号用let 定义的全部变量在花括号外都是不可见的,咱们称之为 块级做用域。
那么回到代码中,for循环含有{ },也就是含有了块级做用域,每一个变量 i 都只是在本身的做用域起做用,例如:第10次循环中的 i 的值不会影响到到第9次循环。

ok!

2.var 声明变量会出现“变量提高“。
What ?
上代码:
var a = 1;
(function(){
   alert(a);
   var a = 2;
})();//结果:undefined
猛的一看,结果不该该是 1 吗,为何会是未定义呢?
缘由就在于咱们在代码块(函数内)里面还声明并定义了一个变量a,致使变量提高了,实际的代码执行顺序是这样的,认真看完你就明白道什么叫变量提高了。
var a = 1;
(function(){
   var a;
   alert(a);
   a = 2;
})();
对比一下两段代码:var a = 2; 这句代码被拆分红两部分:声明var a ; 和 定义a = 2;而声明部分被提高了,到了代码块的前面,运行的时候本身挪到前面了,这就是“变量提高“,结果就是:先执行声明,接着就执行alert(a);变量a只是声明还没定义,就弹出了undefined了。
那么,用let关键字在代码块就不会被提高了吗? 肯定以及确定。
var a = 1;
(function(){
   alert(a);
   let a = 2;
})();   // 结果:报错a未定义
那为何又报错了呢,由于用let声明的变量,在其块级做用域内是封闭的,是不会受到外面的全局变量a影响的,而且要先声明再使用,因此a的值即不是1(由于不受外面的影响),也不是undefined(由于先声明后使用),更不是2,未声明定义就使用,那只有报错了。
注意:let关键字要记得先声明定义再使用。
3.使用let 其它注意点
(1) 同一个块级做用域内,不容许重复声明同一个变量。
错误实例:
{
  var a =1;
  let a =2;   //报错,由于a已经用var声明过
}
{
  let a =1;
  let a= 2;  // 仍是报错,a已经用let声明过。
}
(2) 函数内不能用let从新声明函数的参数
function say(name){
    let name = 'zhang';  //报错:用let从新声明name参数
   alert(name)
}
say('wang');
say()函数内用let从新声明了name这个参数,No!

小结:

用 let 声明变量只在块级做用域起做用,适合在 for 循环使用,也不会出现变量提高现象。同一个代码块内,不可重复声明的相同变量,不可重复声明函数内的参数。

后续更新...
相关文章
相关标签/搜索