Javascript 变量提升在 Scratchpad 中的行为不符合预期

Javascript Variable Hoisting not Behaving as Expected in Scratchpad

我正在关注 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)returnsfalse。如果我 运行 console.log(x); 而不是它实际上 returns 3console.log(myvar); 低于 returns,如预期未定义。

我很困惑这里应该发生什么,文档可能 incorrect/outdated 还是 Scratchpad 解释此代码的方式与标准不同 JavaScript,如果是,为什么?我尝试在 .js 文件中 运行,我得到了预期的结果。

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

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

因此 window 范围内的全局 myvar 变量将被提升,这就是它 returns undefinedconsole.log(myvar);.[=21= 中的原因]

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

您的问题:

并且对于第一个 console.log(x === undefined); 语句,只有当您 重新 执行它时,它才会 return false,所以也许在您的情况下它被执行了两次。