这是2个javascript函数
var a = 10;
function abcd()
{
alert(a);//alerts 10
a=5;
}
另一个代码是这个
var a = 10;
function abcd()
{
alert(a);//alerts undefined
var a=5;
}
在两个函数分配/声明中都是在 alert() 调用之后。那为什么警报消息分别是10
和undefined
?
这是2个javascript函数
var a = 10;
function abcd()
{
alert(a);//alerts 10
a=5;
}
另一个代码是这个
var a = 10;
function abcd()
{
alert(a);//alerts undefined
var a=5;
}
在两个函数分配/声明中都是在 alert() 调用之后。那为什么警报消息分别是10
和undefined
?
那是因为当你声明它时,你的变量被解释器“提升”了它的包含范围。所以你的代码最终会被这样解释:
function abcd()
{
var a;
alert(a); //alerts undefined
a = 5;
}
为避免这种混淆,您可以遵循一些保持原状的做法,例如var
在函数的开头声明局部范围(即在函数范围内使用关键字声明的变量)变量。
请注意,正如您从文章中看到的那样,嵌套函数也会发生这种情况。
在第一个代码片段中,只有一个变量。函数外a
和函数a
内都是指全局变量。
在第二个代码狙击手中有两个名为 的变量a
,一个在函数外部,一个在函数内部。由于变量具有函数作用域,因此函数内部的局部变量存在于整个函数中,而不仅仅是在定义它的行之后。声明被提升到函数的顶部,而赋值仍然发生在它被写入的地方。
我不完全确定这一点,但我想我可以告诉你原因:
当解析第二个函数的源代码时,浏览器会知道在这个函数中将声明一个变量'a'。
'var' 告诉它'a' 应该是函数范围内的一个新变量(不是全局变量)。如果没有“var”(如第一个函数),它将使用已在全局范围内声明的变量“a”。
因此,当它开始执行函数时,它会为它(以及即将在函数中声明的所有其他变量)分配内存。因为 'a' 仅在 'alert()' 函数访问 'a' 时已定义但尚未初始化,所以它返回 'undefined'。
这里有一些棘手的范围主题:)