2011-03-31 126 views
22

对不起这个问题,但这个问题真的搞砸了我的一天。为什么局部变量会杀死我的全局变量?

下面的代码提醒理所应当:

var globalId='10'; 
function check(){ 
    alert(globalId); 
} 
check(); 

但是,这下面的代码警报未定义

var globalId='10'; 
function check(){ 
    alert(globalId); 
    var globalId; 
} 
check(); 

我知道,如果我在一个函数声明一个变量它是一个局部变量,但是如果我已经将其声明为全局变量,那么我的警报怎么会这么说?undefined

这是一个简单的例子,但在我的原代码,我做了很多的东西在函数的开始之间,再长的路下来我检查,看看是否globalId定义,否则定义它:if(!globalId){var globalId;}这意味着生成我的警报坐落在函数的顶部定义,仿佛JavaScript的第一个执行的整体功能,只是为了看看是否有任何变量“可能”来声明,如果是的话,宣布他们,因此我的警报指出,一个“未申报的”变量。

任何人都可以向我解释,为什么出现这种情况,如果这是真的,JavaScript的执行函数之前的“前宣称”所有的变量,即使在条件声明的变量甚至没有见过面吗?

+0

+1非常好的问题 – 2013-01-02 12:53:57

+0

局部变量总会有对全球那些precendence。在C和大多数其他语言中是一样的。在C++中,您可以通过'::'选择全局变量。无论如何,命名全局变量和局部变量同样是一种不好的做法 – 2014-05-22 04:03:41

回答

12

在你的代码的第二部分,局部变量掩盖了全球性的。

var globalId='10'; 

function check() { 
    // Your are defining a local variable in this function 
    // so, the global one is not visible. 
    alert(globalId); 
    var globalId; 
} 

check(); 


事实上,yopur var声明是在函数的定义的结束并没有改变什么:全局变量是整个函数蒙面

因此,对于功能的整个执行过程中,globalId变量将引用本地一个,而不是全球性的。

该功能之外,虽然,全局变量将仍然存在 - 它只是无法从函数内部可以看到,因为var声明。

16

是,在函数的任何位置声明的所有变量都是局部的功能和整个函数的代码存在;它们将优先用于同名的全局变量。

https://developer.mozilla.org/en/JavaScript/Guide/Values,_Variables,_and_Literals#Variable_Scope

JavaScript没有块语句范围;相反,它将位于块所在的代码的本地位置。 [...] JavaScript中另一个不常见的变量是,您可以引用稍后声明的变量,而不会发生异常。这个概念被称为提升; JavaScript中的变量在某种意义上被称为“悬挂”或提升到函数或语句的顶部。

0

您声明NEW变量globalId函数范围内,所以它的未定义,这是正确的。不,它不会杀死你的全局变量,你可以在check();调用后加alert(globalId);来检查它。

22

在javascript中,你应该知道有一种叫做的房源

这实质上意味着什么,当你声明任何局部变量时,变量声明会自动带到范围的顶部。

如: -

var globalId='10'; 
function check(){ 
alert(globalId); var globalId; } 
check(); 

更改 -

var globalId='10'; 
function check(){ 
var globalId; 
alert(globalId);} 
check(); 

由于globalID仍然没有分配任何值,则返回在输出不确定。局部变量总是优先于全局变量的同名。

+0

首先,感谢您和其他所有人,这么快就给我提供了有关范围界定的答案,我不知道所有变量在执行前都移到顶端。但是这里有一个缺陷,那就是如果我在函数内部声明变量var globalId =“ABC123”,它仍然会提示未定义。声明不能移动到顶端,如果那么我的警报不应该是“ABC123”而不是未定义的?正如我所看到的那样,Javascript会移动globalid将被声明的概念,因此在它完成之前无法访问,因为它稍后会在代码中进行访问......? – 2011-03-31 11:53:34

+7

@per Spjuth - 只有声明移动到顶部,而不是分配。因此,如果您在警报之前没有分配,您仍然会得到未定义的值。 – 2011-03-31 11:55:17

0

仿佛第一次的Javascript执行的整体功能,只是为了看看是否有任何变量“可能”被宣布

这就是答案,更多或更少。 JavaScript解释器在每个范围内查找变量声明,然后“将它们移动”到范围的顶部。

+0

Javascript不会执行整个函数,它只是_parses_函数。在实际执行该功能之前,声明将移至顶端。 – Martijn 2011-03-31 12:15:38

2

如前所述,符合JavaScript范围规则,局部变量为整个函数掩盖了全局。然而,全局变量可以被存取时,请尝试以下

var globalId='10'; 

function check() { 
    // Your are defining a local variable in this function 
    // so, the global one is not visible. 
    alert('Local : ' + globalId + ', Global : ' + window.globalId); 
    var globalId; 
} 

check(); 
0
var globalId='10'; 
    function check(){ 
     let globalId = '5'; 
     alert(globalId); 

    } 
    check(); 

// use let to set a local variable between any {}