You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
从上面的可以看出 var 声明的变量没有块级作用域的概念,所以es6引入了let 声明,并绑定在当前的块作用域,块作用域外访问报错,如下:
functiongetValue(condition){if(condition){letvalue='red';}else{console.log(value);// ReferenceError: value is not defined}console.log(value);// ReferenceError: value is not defined}
禁止重复声明。在同一个块中不能用 let 声明已经存在的标识符,否则会报错。如果是嵌套的作用域中重复声明,则不会报错。
varcount=30;letcount=30;// SyntaxError: Identifier 'count' has already been declaredif(true){letcount=30;// 不会报错}
const声明
在es6引入const 来进行常量的声明。他和前面的 let 一样有块作用域绑定和不许重复声明的特性。但是const 必须要在声明的阶段进行初始化,而let 不用。
letcount;// 不会报错constcount;//SyntaxError: Missing initializer in const declarationconstcount=30;// 正确声明
我们知道es5中
var
声明变量是作用于在全局或函数作用域,并且全局声明的变量还会作为window
对象的属性。这样会增加程序错误的产生和不可控。变量提升
在全局或者函数作用内用
var
声明的变量,在js预编译阶段会提升到当前作用域的顶部,这就是变量提升。如下代码:以上代码相当于把变量value放在当前作用域先声明,所以才能在if块外和else块访问到,都会输出
undefined
。let声明
从上面的可以看出
var
声明的变量没有块级作用域的概念,所以es6引入了let
声明,并绑定在当前的块作用域,块作用域外访问报错,如下:禁止重复声明。在同一个块中不能用
let
声明已经存在的标识符,否则会报错。如果是嵌套的作用域中重复声明,则不会报错。const声明
在es6引入
const
来进行常量的声明。他和前面的let
一样有块作用域绑定和不许重复声明的特性。但是const
必须要在声明的阶段进行初始化,而let
不用。const
声明的变量不能再赋值。如果变量是引用类型,可以修改对象的属性值,但不可以重新修改绑定的对象。临时死区
由于
let
与const
不存在变量提升,所以在声明前使用该变量会报错。因为在声明前,该变量存在于所谓的临时死区(TDZ)。当变量声明后,就会从临时死区移出,后续可正常访问。注意的是,TDZ是针对当前的块作用域而言,所以如下可以正确运行:
在循环中的区别
在
var
声明的循环变量,会在循环后外部可正常访问,并且值为跳出循环的值。let
声明的变量则只在循环体内有效,如下:在利用
var
声明的循环中创建函数会变得很艰难,因为函数执行的时候是迭代完的最终,如下:我们可以利用立即执行函数(IIFE)解决这个问题,让每个函数最终保存的是迭代过程中变量的副本。
在es6中循环里面
let
声明可以用来简化上面IIFE的实现过程,他会在每次迭代过程中重新声明一个同名变量i,值为当前的迭代i的值,所以循环体内的函数使用的都是i值的副本。如果把
let
改成const
, 在第二次迭代的时候会报错,因为const
不许重新赋值。而对于for-in
和for-of
循环两者都可以正常的运行。如果把
let
替换成var
,将会输出3个c。因为for-in
和for-of
每次都只会重新声明一个新的副本key。在全局中的绑定
利用
var
在全局声明变量,会作为window对象的一个属性存在,而let
和const
则不会。小结
es6中的
let
和const
与var
区别如下:for
循环中每次创建新的副本window
属性在我们平时的开发中,可以默认使用
const
。在确认需要改变变量的值时才使用let
,可以一定程序上防止代码的错误产生。The text was updated successfully, but these errors were encountered: