javascript变量范围在函数混乱中

时间:2014-03-10 18:30:29

标签: javascript scope hoisting

这是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()调用之后。 那么为什么警报消息分别是10undefined

3 个答案:

答案 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'。

这里有一些棘手的范围主题:)