2013-02-11 54 views
4

“悬挂”在这些例子中this Mozilla的文章,我读:如何在JavaScript的变量从MDN

关于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,直到它们是de clared。你能在什么意义上“引用稍后声明的变量”?

+0

“此变量在此范围语义中声明”被挂起; *作业不会移动*。没有提升(这会使它成为不同的语言:D),第二个例子会在日志语句中引用* outer *'myvar'。就像现在一样,它指的是*内部*'myvar',它*影响外部变量;该值在日志语句时未定义 - 提升不会影响分配。 – 2013-02-11 05:07:08

+0

@pst好的。随着雾气最终升起,忍受着我......我可以问你,你的意思是“阴影”的外部变量吗? – 1252748 2013-02-11 05:13:06

+0

“暂时覆盖” - 它可以防止看到/使用原始的[范围外变量]:D – 2013-02-11 06:09:08

回答

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"; 
})(); 
+0

因此,var var myvar被理解为在函数的范围内被提升,因为它被声明在函数之外,或者在函数内部声明? – matthewpavkov 2013-02-11 05:05:16

+0

@matthewpavkov因为它是在里面声明的。我相信你知道“悬挂”的意思是“举起来”。所以想象'var myvar'这行被“提升”到函数作用域内部的顶部。 – 2013-02-11 05:07:22

+0

开始有点理解它。谢谢。我只是不明白'var myvar =“我的值”;'在示例2中的'function()var myvar; ........'之前立即声明',即声明了它的值为什么不能将'console.log(myvar); // undefined'不是'my value'? – 1252748 2013-02-11 05:11:12