码迷,mamicode.com
首页 > 其他好文 > 详细

12.24 ES6浅谈--块级作用域,let

时间:2019-12-24 18:29:59      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:声明式   结果   OLE   多层   define   避免   fun   独立   第一部分   

第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前。

1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区,在作用域外面使用变量会报错。

2.在循环中,如for循环,let命令相较于var命令会更好,原因在于所声明的变量不会提前到全局。那么在循环结束以后再调用该变量将无法访问。

3.如果是使用var的for循环,如

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

这里后面调用的a[6](),实际上是在调用全局里的i,另外a[i] = 匿名函数,只有当函数被调用时才执行,那么在循环结束后,a[6]()执行,这时候的i只有全局的那个i,也就是10。而如果将var换成了let,结果将会变成6,原因是let声明的每一个i都不提升,所有的i独立在调用函数的时候i实质就是当前循环的i,而i的改变是通过js引擎对上一轮i的记录而修改。

4.使用let声明变量时,for循环中循环条件是父级作用域,循环体是子作用域,两者单独分开,即可以let两个同名变量而不互相影响。

5.暂时性死区:变量使用let声明之后,在块级作用域中声明之前使用将会报错。另外let不允许重复声明变量。还有如let x = x也会报错,因为这里是将x的值赋给x,在未定义x之前就要取得x的值也是暂时性死区,不可取。

6.块级作用域的目的是为了防止变量提升,例如不执行的if语句,会因为变量提升导致内部的值覆盖外部变成Undefined,亦或者执行完之后的for循环的i仍然可以在外部访问。

7.块级作用域允许多层嵌套,内外层变量允许同名,块级作用域可以替代匿名函数的自调用。

8.函数声明式也存在声明提前,所以在ES5中,if条件中声明函数会被提前到当前作用域顶部。在ES6中,为了防止改变导致出现大的问题,所以ES6选择了将函数声明像以var的形式提升,即声明一个函数,其实是var了一个f = undefined。所以应该尽力避免在块级作用域中声明函数,如果要声明请选择函数表达式,f = 匿名函数。

9.let声明变量和声明函数表达式必须带大括号。

今天大概就这样了。




12.24 ES6浅谈--块级作用域,let

标签:声明式   结果   OLE   多层   define   避免   fun   独立   第一部分   

原文地址:https://www.cnblogs.com/harrywu96/p/12092713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!