如何从MDN中的这些示例中"提升"javascript变量

125*_*748 4 javascript

这篇 mozilla文章中,我读到:

关于JavaScript中变量的另一个不同寻常之处在于,您可以引用稍后声明的变量,而不会出现异常.这个概念被称为吊装; JavaScript中的变量在某种意义上是"被提升"或被提升到函数或语句的顶部.但是,尚未初始化的变量将返回undefined值.

然后是一些例子:

/**
 * Example 1
 */
console.log(x === undefined); // logs "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";
})();
Run Code Online (Sandbox Code Playgroud)

上面的示例2将被解释为:

var myvar = "my value";

(function() {
  var myvar;
  console.log(myvar); // undefined
  myvar = "local value";
})();
Run Code Online (Sandbox Code Playgroud)

我没有看到任何被"悬挂"的东西 - 至少在我传统上解释这个词的定义的意义上来说:它似乎是变量,undefined直到它们被宣布之后.在什么意义上你可以"引用后来声明的变量"?

Exp*_*lls 7

当你使用var它时,它被"提升"到函数声明的顶部.让我们再看一下第二个例子:

var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();
Run Code Online (Sandbox Code Playgroud)

请注意如何var myvar = 'my value'被宣布第一.接下来,在函数范围内console.log(myvar)调用.结果是"未定义".为什么?您认为这将是"我的价值",因为这是代码的顺序.

因为var myvar函数范围中的局部变量是悬挂的,所以它没有定义.这基本上相当于编写这样的函数:

(function() {
  var myvar;
  console.log(myvar); // undefined
  myvar = "local value";
})();
Run Code Online (Sandbox Code Playgroud)