【问题标题】:JavaScript: implement let-working with varJavaScript:使用 var 实现 let-working
【发布时间】:2020-06-02 19:03:09
【问题描述】:

所以我有一个克隆 let-behavior 的代码。但我不明白它是如何以及为什么起作用的。谁能解释一下?

(function() {
  var a = 2;
})()

【问题讨论】:

  • 我不明白这个问题。 letvar 在函数定义的顶层几乎是等价的。
  • @Barmar - 我认为关键是 let 的等价物只是在一个块中(但它会显着改善问题以显示 OP 是 what试图克隆)。
  • @T.J.Crowder 谢谢,现在说得通了。我通常是擅长解码这类糟糕问题的人:)
  • @Barmar - 你确实是。 :-)

标签: javascript var let


【解决方案1】:

如果您只能使用 var 变量,但您想确保变量声明不会覆盖另一个同名的预先存在的变量,您可以使用 IIFE 将该变量范围限定为函数.这实际上创建了一个“块”,类似于下面的第二个示例。

var 变量的作用域是函数:

var a = 1;
let b = 1;

(function() {
  var a = 2;
  let b = 1;
})();

console.log(a); //=> 1 (a is not overwritten because the second `var a` is function-scoped)
console.log(b); //=> 1

let 变量的作用域是块:

let a = 1;
var b = 1;

{
  let a = 2;
  var b = 2;
}

console.log(a); //=> 1 (a is not overwritten as let is block-scoped)
console.log(b); //=> 2 (b is overwritten as var is not block-scoped)

值得一提的是,您可以重新声明var 变量,因此可以覆盖现有的同名var 变量。但是,您不能重新声明 let 变量:

var a = 1

// will not error as `var` does not prevent redeclaration
var a = 2

let b = 1

{
  // will not error as `b` is not declared in this block
  let b = 2
}

// will error as `b` is already declared in this scope
let b = 3

您可以在this question and its answers 中阅读有关letvar 的更多信息。

【讨论】:

    【解决方案2】:

    let 的范围仅限于它出现的块。

    var 的作用域是它出现的函数。

    通过将块替换为函数(立即调用)var 的范围与 let 的代码行相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2022-12-01
      • 1970-01-01
      • 2020-09-29
      • 2016-04-05
      • 2018-06-08
      • 2021-10-19
      • 2016-03-11
      相关资源
      最近更新 更多