pis*_*bee 8 javascript scope var let
let/ const代替var以后进行维护?(这来自Airbnb风格指南)我不确定您的问题是否真的得到了解答:
块作用域有时与函数作用域相同吗?我知道函数作用域适用于函数内的所有内容,但不知道块作用域到底是什么。
是的,块作用域有时与函数作用域相同。块作用域是一组大括号内的所有内容{ a block scope here }。因此,在函数代码的顶部,块作用域将与函数作用域相同:
function test(x) {
// this is both a block scope and a function scope
let y = 5;
if (x) {
// this is a smaller block scope that is not the same as the function scope
let z = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
对于Javascript,目前是否建议使用let / const代替var以便将来维护?(这是来自 Airbnb 风格指南)
let是const最新 ES6 规范的一部分,仅在最新的 Javascript 引擎中实现,有时在最新的引擎中,它们仅通过特殊标志启用。它们将出现在所有较新的 JS 引擎/浏览器中,但尚未广泛部署。因此,如果您正在为广泛的互联网上的常规浏览器使用而编写 Javascript,那么您还不能可靠地使用letand const。
在某些情况下,您现在可以安全地使用letand进行编程:const
如果您仅针对特定的 Javascript 引擎,并且知道它支持这些功能(例如特定版本的 Nodejs 或仅适用于特定浏览器的特定版本的插件)。
如果您使用的转译器会将您的代码转换为可在所有浏览器中运行的代码。使用转译器时,您可以使用最新功能编写代码,转译器将“简化它”,以便您的代码可以通过使用新功能的模拟在旧浏览器中运行。
如果您正在为您知道let并const受支持的环境进行编程,那么建议您适当地使用它们。如果你在函数的顶部声明一个变量,那么let和var会做同样的事情。
如果您在函数内的较小作用域中声明变量,则该变量let将包含在较小的作用域内,但var将被提升到函数的顶部,并且无论在何处声明它,都将具有函数作用域。
您链接到的AirBnb风格指南是专门为 ES6 环境编写的(请注意,其风格指南的 ES5 版本有一个单独的链接)。因此,这意味着他们正在假设一个支持 ES6 的环境。这要么是因为他们的目标是他们知道支持 ES6 的服务器端 JS 引擎,要么是因为他们正在使用一个转译器将 ES6 代码转换为可以在 ES5 引擎上运行的代码。
关于转译器的注释。 在使用转译器并将所有变量声明切换到let块作用域内之前,有必要了解转译器生成的代码类型以及它生成的额外代码是否会对应用程序的性能产生任何影响。例如,let通过创建内联 IIFE 来模拟 for 的块作用域,这可能会导致每个包含语句的块产生额外的运行时开销let。我并不是说这一定是一件坏事,应该阻止您使用转译器,但是在决定是否使用转译器时,我建议您彻底熟悉各种 ES6 的转译代码是什么样子的功能,以便您知道它是否适合您所从事的任何工作或仅适合某些工作。