Javascript 中的块作用域、函数作用域和局部作用域

Block scope, function scope and local scope in Javascript

  1. 块作用域有时是否与函数作用域相同?我知道 function scope 适用于函数内的所有内容,但不明白 block scope 到底是什么。
  2. 对于Javascript,是否目前建议使用let/const而不是var用于未来的维护? (这是来自 Airbnb Style Guide
  1. javascript 5 不使用阻塞作用域它使用链式作用域。主要区别在于除非将其设为全局变量,否则您无法访问作用域外的变量。当您使用 let 声明变量时,ES 6 将具有阻塞作用域。
  2. 目前推荐使用 var,因为 ES 6 不完全支持。

Is block scope sometimes the same as function scope? I know function scope is for everything inside a function, but don't get what exactly a block scope is.

块范围是中的所有内容,例如:

function foo() {
    // function scope
    if (condition) {
        // block scope
    }
}

从第 5 版规范开始,JavaScript 没有块作用域。即将完成的下一个规范(ECMAScript 6,又名 "ES6")通过 letconst.

添加块作用域

For Javascript, is it currently recommended to use let / const instead of var for future maintenance?

这完全取决于您。 letconst 是您可以添加到腰带中的新工具。如果您不希望他们这样做,他们 没有 来替换 var。也就是说,您经常听到“let 是新的 var”。

let 声明的变量有块作用域,用 var 声明的变量没有。

请注意 letconst don't have great support in the wild yet。毫不奇怪,将块作用域添加到以前从未有过的引擎中可能是非常重要的。您可以使用像 Babel 这样的转译器,或者暂时继续使用 var

我不确定你的问题是否真的得到了回答:

Is block scope sometimes the same as function scope? I know function scope is for everything inside a function, but don't get what exactly a block scope is.

是的,块作用域有时与函数作用域相同。块作用域是一组大括号 { 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;
   }
}

For Javascript, is it currently recommended to use let / const instead of var for future maintenance? (This was from Airbnb Style Guide)

letconst 是最新的 ES6 规范的一部分,仅在最新的 Javascript 引擎中实现,有时在最新的引擎中它们仅通过特殊标志启用。它们将用于所有较新的 JS engines/browsers,但尚未广泛部署。因此,如果您编写 Javascript 是为了在广泛的互联网上使用常规浏览器,您还不能可靠地使用 letconst

在某些情况下,您现在可以安全地使用 letconst 进行编程:

  1. 如果您只针对特定的 Javascript 引擎并且您知道它支持这些功能(例如特定版本的 nodejs 或仅针对特定的插件特定浏览器的版本)。

  2. 如果您使用的转译器会将您的代码转换为可在所有浏览器中 运行 的代码。使用转译器时,您可以使用最新功能编写代码,转译器将 "dumb it down" 通过使用新功能的模拟,让您的代码在旧版浏览器中工作。

如果您正在为知道支持 letconst 的环境编程,那么建议您适当地使用它们。如果您在函数的顶部声明一个变量,那么 letvar 将做同样的事情。

如果您在函数内的较小范围内声明变量,则 let 将包含在较小的范围内,但 var 将被提升到函数的顶部并且将具有函数作用域,无论在何处声明。


您 link 阅读的 AirBnb Style Guide 是专门为 ES6 环境编写的(请注意,他们的风格指南的 ES5 版本有一个单独的 link)。所以,这意味着他们假设一个支持 ES6 的环境。那是因为他们的目标是他们知道支持 ES6 的服务器端 JS 引擎,或者因为他们正在使用将 ES6 代码转换为可以在 ES5 引擎上 运行 的东西的转译器。


关于转译器的说明。在使用转译器并将所有变量声明切换到块范围内的let之前,有必要了解转译器生成的代码类型以及它生成的额外代码是否对应用程序的性能有任何影响。例如,let 的块范围是通过创建一个内联 IIFE 来模拟的,这可能会导致每个包含 let 语句的块的额外 运行 时间开销。我并不是说这一定是一件坏事,应该阻止你使用转译器,但在决定是否使用转译器时,我建议你彻底熟悉各种 ES6 的转译代码是什么样的功能,以便您了解它是否适​​合您的任何工作或仅适合某些工作。