12.24 ES6浅谈--块级作用域,let
Posted harrywu96
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12.24 ES6浅谈--块级作用域,let相关的知识,希望对你有一定的参考价值。
第一部分: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的主要内容,如果未能解决你的问题,请参考以下文章