为什么局部变量会杀死我的全局变量?

Per*_*uth 25 javascript variables global-variables local-variables

对不起这个问题,但这个问题真的搞砸了我的一天.

以下代码警告10应该:

var globalId='10';  
function check(){  
    alert(globalId);  
}  
check();
Run Code Online (Sandbox Code Playgroud)

但是下一个代码警告未定义:

var globalId='10';  
function check(){  
    alert(globalId); 
    var globalId; 
}  
check();
Run Code Online (Sandbox Code Playgroud)

我知道如果我在函数中声明一个变量,它是一个局部变量,但如果我已经将它声明为全局变量,那么我的警报怎么说未定义呢?

这是一个简单的例子,但在我的原始代码中,我在函数的开头之间做了很多东西,然后我检查了很长时间以查看是否globalId已定义,否则定义它:if(!globalId){var globalId;}这意味着我的警报位于函数顶部生成未定义,好像JavaScript首先执行整个函数,只是为了查看是否可以声明任何变量,如果是,则声明它们,因此我的警报指向'未声明'变量.

任何人都可以向我解释为什么会发生这种情况,并且如果JavaScript在执行函数之前"预先声明"所有变量,那么甚至在甚至不满足的条件下声明的变量也是如此?

Sac*_*hag 23

在javascript中,你应该知道有一些叫做HOISTING的东西.

这实质上意味着,当您声明任何局部变量时,变量声明会自动传递到范围的顶部.

例如:-

var globalId='10';
function check(){
alert(globalId); var globalId; }
check(); 
Run Code Online (Sandbox Code Playgroud)

变更为 -

var globalId='10';
function check(){
var globalId;
alert(globalId);}
check(); 
Run Code Online (Sandbox Code Playgroud)

由于globalID仍未分配任何值,因此它会在输出中返回undefined.局部变量总是优先于具有相同名称的全局变量.

  • @per Spjuth - 只有声明被移到顶部,而不是赋值.因此,如果您在警报之前没有分配,您仍然会被定义. (7认同)

Gar*_*han 16

是的,函数中任何地方声明的所有变量都是该函数的本地变量,并且存在于整个函数的代码中; 它们将优先用于同名的全局变量.

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

JavaScript没有块语句范围; 相反,它将是块所在代码的本地代码.[...] JavaScript中变量的另一个不寻常之处在于,您可以引用稍后声明的变量,而不会出现异常.这个概念被称为吊装; JavaScript中的变量在某种意义上是"被提升"或被提升到函数或语句的顶部.


Pas*_*TIN 13

在代码的第二部分中,局部变量掩盖了全局变量.

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(); 
Run Code Online (Sandbox Code Playgroud)


yopur var语句位于函数定义末尾的事实不会改变任何内容:全局变量被屏蔽为整个函数.

因此,对于函数的整个执行,globalId变量将引用本地变量,而不是全局变量.

但是,在该函数之外,全局变量仍然存在 - 由于该var语句,它将不会从函数内部看到.