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个答案)
去年关闭。
如下代码所示,我使用了
但是,如果使用let声明值,则无法获取该值的值,则打印内容未定义。不管是使用let还是var语句,value都是一个全局变量,这令人非常困惑。为什么会有这样的差异?
你知道为什么吗?你能告诉我吗?非常感谢你。
使用
或as MDN puts it:
那是
(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
的设计目的。