1

我正在关注 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 文件中运行,并且得到了预期的结果。

4

1 回答 1

0

在立即函数中,您在以下位置重新声明了myvar变量:

(function() {
  console.log(myvar); // undefined
  var myvar = 'local value';
})();

因此,作用域中的全局myvar变量window将被提升,这就是它返回undefinedin的原因console.log(myvar);

另一方面,如果您将其替换为console.log(x);,它将打印3,因为您尚未重新声明该x变量。

你的问题:

对于第一console.log(x === undefined);条语句,它false只会在你重新执行时返回,所以在你的情况下它可能被执行了两次。

于 2017-11-27T16:23:05.613 回答