这是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
?
答案 0 :(得分:10)
那是因为你声明它时你的变量会被解释器获得"hoisted" up of its containing scope。所以你的代码最终被解释为:
function abcd()
{
var a;
alert(a); //alerts undefined
a = 5;
}
为了避免这种混淆,您可以遵循一些保持原则的实践,例如声明本地作用域(即在函数作用域内使用关键字var
声明的变量)变量功能的开头。
请注意,正如您可以从文章中读到的那样,嵌套函数也会发生这种情况。
答案 1 :(得分:3)
在第一个代码段中,只有一个变量。函数外部的a
和函数内的a
都指向全局变量。
在第二个代码狙击手中有两个名为a
的变量,一个在函数外部,一个在函数内部。由于变量具有函数作用域,函数内部的局部变量存在于整个函数中,而不仅仅是在它定义的行之后。声明被提升到函数的顶部,而赋值仍然发生在写入的地方。
答案 2 :(得分:0)
我对此并不完全确定,但我想我可以告诉你原因:
当解析第二个函数的源代码时,浏览器将知道将要声明一个变量' a'在这个功能。
'无功'告诉它' a'应该是函数范围内的新变量(不是全局变量)。
如果没有' var' (就像在第一个函数中一样),它将使用变量' a'这已经在全球范围内宣布。
因此,当它开始执行该函数时,它会为它分配内存(以及即将在函数中声明的所有其他变量)。因为' a'只有在' alert()'时才定义但尚未初始化。功能访问' a',它返回' undefined'。
这里有一些棘手的范围主题:)