我正在关注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,因此在您的情况下,它可能执行了两次。

07-24 09:38
查看更多