This question already has answers here:
What's the difference between using “let” and “var”?

(37个答案)



Do let statements create properties on the global object?

(5个答案)


去年关闭。




如下代码所示,我使用了var value = 1,获得的值为1。我能理解这一点,因为这里的return this.value指向窗口,因此我可以打印出全局变量值。

var value = 1;
let obj = {
  getValue: function() {
    return function() {
      return this.value;
    }
  }
}
console.log(obj.getValue()());  // 1


但是,如果使用let声明值,则无法获取该值的值,则打印内容未定义。不管是使用let还是var语句,value都是一个全局变量,这令人非常困惑。为什么会有这样的差异?

let value = 1;
let obj = {
  getValue: function() {
    return function() {
      return this.value;
    }
  }
}
console.log(obj.getValue()());  // undefined


你知道为什么吗?你能告诉我吗?非常感谢你。

最佳答案

作为MDN explains:



这是因为let总是创建一个词法范围的变量。如果改为创建全局对象的属性,则这些属性对于其他作用域中的代码将是可见的。它们不再在词法范围内,从而克服了使用let的问题。

如果您想知道在全局作用域中没有词法包含的“其他作用域”,那么可以有多个脚本文件。或查看您的示例的以下变体:

let getValue = function() {
  return this.value;
};

let value = 1;
console.log(getValue());


使用var value = 1;仍将输出1。但是使用let时,它会输出undefined,因为该函数是在声明value的块之外按词法定义的,因此即使通过全局对象也无法访问它。

as MDN puts it:



那是let的设计目的。

10-08 08:01
查看更多