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

时间:2013-02-11 04:59:09

标签: javascript

this mozilla文章中,我读到:

  

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

然后是一些例子:

/**
 * 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";
})();
  

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

var myvar = "my value";

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

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

1 个答案:

答案 0 :(得分:7)

当您使用var时,它会被“提升”到函数声明的顶部。让我们再看一下第二个例子:

var myvar = "my value";

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

注意var myvar = 'my value'如何首先声明 。接下来,在函数范围内,调用console.log(myvar)。结果是“未定义”。为什么?您认为这将是“我的价值”,因为这是代码的顺序。

因为函数作用域中的局部变量var myvar被挂起,所以它没有被定义。这基本上等同于编写这样的函数:

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