- 块级作用域有时与函数作用域相同吗?我知道函数作用域适用于函数内的所有内容,但不明白什么是块级作用域。
- 对于Javascript,目前是否建议在未来维护中使用
let
/const
而不是var
?(这是来自 Airbnb Style Guide 的建议)
let
/ const
而不是 var
?(这是来自 Airbnb Style Guide 的建议)我不确定您是否已经得到了答案:
块级作用域有时与函数作用域相同吗? 我知道函数作用域适用于函数内部的所有内容,但不明白什么是块级作用域。
是的,块级作用域有时与函数作用域相同。 块级作用域是一组大括号内的所有内容 { 这里是一个块级作用域 }
。 因此,在函数代码的顶部,块级作用域将与函数作用域相同:
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;
}
}
let
和const
是最新ES6规范的一部分,只在最新的Javascript引擎中实现,并且有时在最新的引擎中仅通过特殊标志启用。它们将出现在所有更新的JS引擎/浏览器中,但尚未广泛部署。因此,如果您正在编写面向广泛互联网的常规浏览器消费的JavaScript,则不能可靠地使用let
和const
。let
和const
:
如果您只针对特定的Javascript引擎进行开发,并且您知道它支持这些功能(例如特定版本的nodejs或仅适用于特定浏览器版本的插件),那么可以使用这些功能。
如果您使用转译器将代码转换为在所有浏览器中运行的代码。使用转译器时,您可以使用最新的功能编写代码,转译器将“降级”代码以便在旧浏览器中使用模拟的新功能。
如果您正在为已知支持let
和const
的环境编程,则建议根据需要使用它们。如果您在函数顶部声明变量,则let
和var
将执行相同的操作。
如果您在函数内的较小范围内声明变量,则let
将包含在较小的范围内,但var
将被提升到函数的顶部,并具有函数作用域,无论在何处声明。
let
之前,值得了解转译器生成的代码类型以及它所生成的额外代码是否对应用程序的性能产生影响。例如,let
的块级作用域是通过创建内联IIFE来模拟的,这可能会导致每个包含let
语句的块都有额外的运行时开销。我并不是说这一定是一个应该阻止您使用转译器的坏事情,但在决定是否使用转译器时,建议您彻底熟悉各种ES6功能的转译代码看起来像什么,以便知道它是否是您拥有的任何工作的正确工具或仅适用于某些工作。块作用域有时与函数作用域相同吗?我知道函数作用域适用于函数内部的所有内容,但不知道块作用域确切是什么。
块作用域是指在一个 块 内的所有内容,例如:
function foo() {
// function scope
if (condition) {
// block scope
}
}
let
和 const
添加了块级作用域。
这完全取决于您。对于 JavaScript,是否建议在未来的维护中使用
let
/const
替代 var?
let
和 const
是您可以添加到工具箱的新工具。如果您不想这样做,它们并不一定需要替换 var
。尽管如此,您常常会听到 "let
是新的 var
"。let
声明变量具有块级作用域,而使用 var
声明变量则没有。let
和const
在实际应用中的支持还不够完善。毫无疑问,将块级作用域添加到以前从未拥有过它的引擎中是相当困难的。您可以使用像Babel这样的转译器,或者现在继续使用var
。(链接)