轻松理解Javascript变量的相关问题(3)

(脆弱的语法细节:let是一个严格模式下的保留词。在非严格模式下,出于向后兼容的目的,你仍可以用let命名来声明变量、函数和参数,虽然你不会犯傻,但是你确实可以编写var let = 'q';这样的代码!不过let let;无论如何都是非法的。)

在那些不同之外,let和var几乎很相似了。举个例子,它们都支持使用逗号分隔声明多重变量,它们也都支持 解构 特性。

注意,class类声明的行为与var不同而与let一致。如果你加载一段包含同名类的脚本,后定义的类会抛出重定义错误。

const

是的,还有一个新的关键词!

ES6引入的第三个声明类关键词与let类似:const。

const声明的变量与let声明的变量类似,它们的不同之处在于,const声明的变量只可以在声明时赋值,不可随意修改,否则会导致SyntaxError(语法错误)。

const MAX_CAT_SIZE_KG = 3000; // 正确 MAX_CAT_SIZE_KG = 5000; // 语法错误(SyntaxError) MAX_CAT_SIZE_KG++; // 虽然换了一种方式,但仍然会导致语法错误

当然,规范设计的足够明智,用const声明变量后必须要赋值,否则也抛出语法错误。

const theFairest; // 依然是语法错误,你这个倒霉蛋

神秘的代理命名空间

“命名空间是一种绝妙的理念,我们应当多加利用!”——Tim Peters,“这是Python之禅”

嵌套作用域是编程语言背后的核心理念之一,这个理念始于大约57年前的 ALGOL,现在回过头看当时的决定无比正确。

在ES3之前,JavaScript中只有全局作用域和函数作用域。(让我们忽略with语句吧。)ES3中引入了try-catch语句,意味着语言中诞生一种新的作用域,只用于catch块中的异常变量。ES5添加了用于严格的eval()方法的作用域。ES6添加了块作用域,for循环作用域,新的全局let作用域,模块作用域,以及求参数的默认值时使用的附加作用域。

所有自ES3开始添加的其它作用域非常重要,它们的加入使得JavaScript面向过程与面向对象的特性运行得犹如闭包一样平稳、精准,当然闭包也可以无缝衔接这些作用域实现各种功能。或许你在阅读这篇文章之前从未注意到这些作用域规则的存在,如果真的这样,那这门语言就恰如其分地完成了它的本职工作。

我现在可以使用let和const了么?

可以。如果要在Web上使用let和const特性,你需要使用一个诸如 Babel 、 Traceur或 TypeScript 的ES6转译器。(Babel和Traceur暂不支持临时死区特性。)

io.js支持let和const,但是只在严格模式下编码可以使用。Node.js同样支持,但是需要启用--harmony选项。

九年前 ,Brendan Eich在Firefox中实现了初版的let关键词。这个特性在随后的标准化进程中彻底地被重新设计了。Shu-yu Guo正在按照新标准对原有实现进行升级,该项目由Jeff Walden和其他人做代码审查。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdzfd.html