5

这是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

4

3 回答 3

10

那是因为当你声明它时,你的变量被解释器“提升”了它的包含范围。所以你的代码最终会被这样解释:

function abcd()
{
 var a;
 alert(a); //alerts undefined
 a = 5;
}

为避免这种混淆,您可以遵循一些保持原状的做法,例如var在函数的开头声明局部范围(即在函数范围内使用关键字声明的变量)变量。

请注意,正如您从文章中看到的那样,嵌套函数也会发生这种情况。

于 2014-03-10T18:34:12.447 回答
3

在第一个代码片段中,只有一个变量。函数外a和函数a内都是指全局变量。

在第二个代码狙击手中有两个名为 的变量a,一个在函数外部,一个在函数内部。由于变量具有函数作用域,因此函数内部的局部变量存在于整个函数中,而不仅仅是在定义它的行之后。声明被提升到函数的顶部,而赋值仍然发生在它被写入的地方。

于 2014-03-10T18:39:10.000 回答
0

我不完全确定这一点,但我想我可以告诉你原因:

当解析第二个函数的源代码时,浏览器会知道在这个函数中将声明一个变量'a'。
'var' 告诉它'a' 应该是函数范围内的一个新变量(不是全局变量)。如果没有“var”(如第一个函数),它将使用已在全局范围内声明的变量“a”。

因此,当它开始执行函数时,它会为它(以及即将在函数中声明的所有其他变量)分配内存。因为 'a' 仅在 'alert()' 函数访问 'a' 时已定义但尚未初始化,所以它返回 'undefined'。

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

于 2014-03-10T18:40:34.907 回答