在JavaScript ES6中使用let和const定义变量

JavaScript世界里面的每个人都在说有关ECMAScript 6 (ES6,也称作ES 2015)的话题,对象的巨大变化 (, super(), 等), 函数 (默认参数等), 以及模块 (导入/导出), 但很少有人关注变量以及如何定义。事实上,还是有一些关注,但是可能关注点并非正确。我最近参加了英国jQuery会议,在会议上Dave Methvin发表了一场关于ES6简介的演讲,演讲内容包含了很多关于letconst的内容。

通过这篇文章,我想介绍var的这两个不同的关键字,以及它们在定义和使用上的区别。并且更重要的,我要确定哪些人正在考虑在ES6中使用声明变量的新标准。基本概念是let应该立刻取代var作为定义的关键字。事实上,按照一些案例,var简单的说不应该再在新代码中使用。const关键字用在那些永远不会改变的变量申明,let用在其他变量申明上。

 

let取代var

这个代码示例一看上去似乎比较有戏剧性,但是对我们思考letvar的差异来说,显得不会太多。var在离它最近的父函数内创建了一个变量的作用域let在它最近的块级中创建作用于,这些块包括for循环,if语句以及其他块。

在这个例子中,我们创建了一个foo的函数(以及变量作用域),并且稍后我们调用它。最后一个console.log()语句预期会产生一个ReferenceError,因为x只在foo()中定义(作用域)。因为变量提升,第一个console预计将被正常执行。在这个示例中,xundefined。第二个console预计更加有趣。事实上,两个log(y)都将出错,因为letvar的作用于更加严格。y变量只存在于if块里面,不在任何其他地方。Dave Methvin称let之前的区域叫做“临时死亡区。”

希望这个例子能够向你展示let的特性,但是你或许会说有时候你实际上想有一个函数范围作用域的变量。没问题,简单的说在函数顶部创建这个变量就好了。

上面的函数在函数顶部定义了y,因此相比第一个例子,赋予了它更大范围的作用域。我们可以看见y在这个函数任意地方都可以访问,但是在外面不行,因此最后一个console.log(y) 语句依然会产生ReferenceError。在我们介绍const前, 让我们重申一下这点:在ES6中let应该完全取代var。上面的示例向你展示了let十分强大,并且和var一样拥有十分多的灵活性。我并不是第一个这样说的人但是我现在是这种想法的信仰者。

常量索引,不是值

在ES6中另外一个定义变量的关键字是const, 但是它经常被误会为一个“常量”。在ES6中,const代表一个值的常量索引(事实上绝大多数语言都提供这样的功能)。换句话说,变量名字在内存中的指针不能够改变,但是指向这个变量的值可能改变。

这里有一个简单的例子。在下面的例子中我们可以创建一个拥有常量索引的数组变量。我们在之后添加值到这个数组中并不改变这个索引,一切都可以运行起来:

但是,如果我们尝试修改变量索引到一个新的数组——即使是和现在内容一样的数组——我们将获得一个SyntaxError (“Assignment to constant variable”):

当然,如果你拥有一个指向string或者number的const,当然这里就不会有任何可以修改的值。所有String和Number的方法返回新的值(对象)。

最后一个关于使用const的注意事项是参考let的新作用域规则!那意味着我们应该在我们的代码中使用letconst完全代替var。事实上,依然有很多人支持作为没有涉及到的遗留代码只“允许”使用var的想法当一个程序员在一个文件中更新一些代码,他们应该 (并且可能)将所有var语句更新为适当的有适当作用域的let或者const

但是只适配ES6…

那是对的。新的letconst关键字在ES5中不生效,并且因此在绝大多数可执行环境中也不生效。但是,通过类似Babel优秀的编译器, 我们可以将我们写的ES6 JavaScript代码编译为可在浏览器环境中执行的ES5代码。

对于开发Node.js (以及io.js)的程序员来说,幸运但是我们不需要考虑某人使用什么浏览器来执行我们的代码。如果你正在使用Node v0.12 (你正在使用,对吗?), 你可以通过两个小修改来使用这些新功能。第一步,你必须使用“harmony”功能来运行你的代码(最初ES6开发代码是“harmony”):

第二个改变是任何使用letconst(或其它ES6功能)的代码必须使用严格模式。为了实现这个,简单的将"use strict;"放在每个模块最顶部。另一方面,你可以在CLI中使用--use-strict标志,但这似乎有些多余。

在io.js中你不必需要--harmony标志,因为所有这些功能都在代码中集成。但是,你还是必须使你代码为严格模式。再次说明,很简单的通过在你每隔模块文件顶部加上"use strict";语句来实现。

1.0.0你在使用io.js吗?希望StrongLoop支持它吗?我们已经支持了!除了StrongLoopAPI平台已经能在io.js上运行,我们也提供给我们的顾客在io.js上运行。

现在出去,并创建一个更好的变量声明工作流程!

接下来

  • Interested in more ES6 features?How about this post on Generators from Marc Harter?
  • If you’re curious what comes next after Node.js v0.12, check out this post from core contributor Bert Belder
  • And if you want to get started building APIs in Node.js with LoopBack, head over to our “Getting Started” page!

原文链接

此条目发表在研发分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论