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.局部变量总是优先于具有相同名称的全局变量.
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
语句,它将不会从函数内部看到.
归档时间: |
|
查看次数: |
10633 次 |
最近记录: |