我正在关注Mozilla开发人员Javascript教程,并且在变量托管方面有一段。本教程曾提到使用Firefox的Scratchpad来编辑javascript以快速保存并查看代码运行。
我使用的代码(从教程复制粘贴)为:
/**
* Example 1
*/
console.log(x === undefined); // true
var x = 3;
/**
* Example 2
*/
// will return a value of undefined
var myvar = 'my value';
(function() {
console.log(myvar); // undefined
var myvar = 'local value';
})();
但是
console.log(x === undefined)
返回false
。如果我运行console.log(x);
,它实际上会返回3
。下面的console.log(myvar);
返回未定义的预期值。我很困惑,因为这里应该发生什么事情?文档是否可能不正确/已过时,或者Scratchpad解释此代码的方式与标准JavaScript有所不同?我尝试在.js文件中运行,但获得了预期的结果。
最佳答案
在即时函数中,您在以下位置重新声明了myvar
变量:
(function() {
console.log(myvar); // undefined
var myvar = 'local value';
})();
因此,将悬挂
myvar
范围中的全局window
变量,这就是为什么它在undefined
中返回console.log(myvar);
的原因。另一方面,如果将其替换为
console.log(x);
,则将打印3
,因为尚未重新声明x
变量。你的问题:
对于第一个
console.log(x === undefined);
语句,仅当您重新执行它时,它才会返回false
,因此在您的情况下,它可能执行了两次。