很抱歉问这个问题,但这个问题确实搞砸了我的一天。
以下代码按其应有的方式发出警报 10:
var globalId='10';
function check(){
alert(globalId);
}
check();
但是接下来的代码会警告未定义:
var globalId='10';
function check(){
alert(globalId);
var globalId;
}
check();
我知道,如果我在函数中声明一个变量,它是一个局部变量,但如果我已经将它声明为全局变量,我的警报怎么会显示未定义?
这是一个简单的示例,但在我的原始代码中,我在函数开头之间做了很多事情,然后很长一段时间我检查了 globalId
是否已定义,否则定义它: if(!globalId){var globalId;}
这意味着位于函数顶部的警报生成未定义,就好像 JavaScript 首先执行整个函数一样,只是为了查看是否有任何变量“可能”被声明,如果是,则声明它们,因此我的警报指向“未声明”变量。
任何人都可以向我解释为什么会发生这种情况吗?JavaScript 在执行函数之前是否“预先声明”了所有变量,甚至是在不满足的条件下声明的变量?
最佳答案
在 javascript 中,你应该知道有一个叫做 HOISTING 的东西。
这本质上意味着,当您声明任何局部变量时,变量声明会自动带到作用域的顶部。
例如:-
var globalId='10';
function check(){
alert(globalId); var globalId; }
check();
更改为 -
var globalId='10';
function check(){
var globalId;
alert(globalId);}
check();
由于 globalID 仍未分配任何值,因此它在输出中返回 undefined。局部变量始终优先于同名的全局变量。
关于javascript - 为什么局部变量会杀死我的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5499120/