ES6学习笔记--块级绑定

var变量与变量提高

使用var关键字声明的变量,不管其实际声明位置在何处,都会被视为声明于所在函数的顶部(若是声明不在任意函数内,则被视为在全局做用域的顶部)。这就是所谓的变量提高(hoisting)es6

clipboard.png

后台实际上会转化成这样浏览器

clipboard.png

value变量的声明被提高到了顶部,而初始化工做则保留在原处。这觉得着在else分支value的变量也是可访问的,此处它的值会是undefined,由于它并无被初始化。安全

块级声明

块级声明也就是让所声明的变量在指定快的做用域外没法被访问。块级做用域在以下状况被建立;
1 在一个函数内部
2 在一个代码块(由一对花括号包裹)内部函数

let声明语法域var语法一致spa

clipboard.png

let声明没有被提高到函数定义的顶部,这样使用会报3d

clipboard.png

上面就是块级做用域的基本使用。下面会带来一点let和var特别的地方对象

禁止重复声明

若是一个标识符已经在代码块内部被定义,那么在此代码块内使用同一个标识符进行let声明就会致使抛出错误blog

clipboard.png
上面会报错,可是var声明是不会的ip

clipboard.png
不在同一级别声明变量,不会报错,这个新变量会屏蔽全局的
count变量,从而在局部阻止对于后者的访问。作用域

常量声明

const常量,它们的值在被设置完成后就不能再被改变,全部的const变量都须要在声明试进行初始化。

clipboard.png

对比常量声明与let声明
1 常量声明与let声明,都是块级声明。这意味着常量在声明它们的语句块外部是没法访问的,而且声明也不会被提高
2 const变量和let另外一个类似的地方,也是禁止重复声明

使用const声明对象
const声明会阻止对于变量绑定与变量自己自身值的修改,这意味着const声明并不会阻止对变量成员的修改

clipboard.png

记住:const阻止的是变量绑定的修改,而不是阻止对成员值的修改。

暂时性死区

使用let或const声明的变量,在达到声明处以前都是没法访问的,试图访问会致使一个引用错误,即便在一般是安全的操做时(例如使用typeof运算符),也是如此

clipboard.png

块级做用域最须要使用的场景1-循环中的块级绑定

clipboard.png

clipboard.png
对比var let明显使用let符合咱们的使用指望。

块级做用域最须要使用的场景2-循环内的函数

clipboard.png

上述缘由由于变量i在循环的每次迭代被共享了(没有块级做用域)
为了修正这个问题,开发者在循环内使用当即调用函数表达式,以便在每次迭代中强制建立变量的一个新副本

clipboard.png

幸运的是使用let完美解决这个问题

clipboard.png
let每次使用完,就销毁从新建立。

clipboard.png

循环内的常量声明

在常规的for循环中,你能够初始化时使用const。但循环会在试图改变该变量的值时抛出错误。

clipboard.png

BUT!!!!!!!!!!!!!
const变量在for-in或for-of循环中使用时,与let变量效果相同。

clipboard.png

最后一点---全局块级绑定

let与const不一样于var的另外一个方面是在全局做用域上的表现。当在全局做用域上使用var时,它会建立一个新的全局变量,并成为全局对象(在浏览器中是window)的一个属性,这意味着使用var可能会无心覆盖一个已有的全局属性

clipboard.png

然而若你在全局做用域上使用let或者const。虽然在全局做用域上会建立新的绑定,但不会有任何属性被添加到全局对象上。这也就意味着你不能使用let或const来覆盖一个全局变量,你只能将其屏蔽。

clipboard.png

块级绑定新的最佳实践

在es6的发展阶段,被普遍承认的变量声明方式是:默认状况下应当使用let而不是var。对于多数js开发者来讲,let的行为方式正式var本应有的方式,所以直接用let代替var更符合逻辑。

然而随着更多的开发者迁移到es6上,一种代替方案变得更为流行。那就是默认状况下使用const,而且只在知道变量值须要被更改的状况下才使用let。其理论依据是大部分变量在初始化以后都不该当被修改,觉得预期外的改动是bug的源头之一。

总结

let 与 const 块级绑定将词法做用域引入js。这两种声明方式都不会进行提高。而且只会在声明它们的代码块内部存在。因为变量可以再必要位置被准确声明,其表现更加接近其余语言,而且能减小无意错误的产生,做为一个反作用,你不能在变量声明位置以前访问它们,即使使用的是typeof 这样的安全运算符,因为块级绑定存在暂时性死区,试图在声明位置以前访问它就会致使错误。

let与const的表如今不少状况下都类似与var ,而后在循环中就不是这样,在for-in与for-of循环中。let与const都能每一次迭代时建立一个新的绑定,这意味着在循环体内建立的函数可使用当前迭代所绑定的循环变量值(而不是像使用var那样,统一使用循环结束时的变量值)。这一点在for循环中使用let声明时也成立,不过在for循环中使用const声明则会致使错误。

块级绑定当前的最佳实践就是:在默认状况下使用const.而只在你知道变量值须要被更改的状况下才使用let。这在代码中可以确保基本层次的不可变性,有助于防止某些类型的错误。

相关文章
相关标签/搜索