函数混乱中的javascript变量范围

函数混乱中的javascript变量范围,javascript,scope,hoisting,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()调用之后。 那么为什么警报消息分别是10和未定义的?这是因为在声明变量时,解释器会获取它。因此,您的代码最终被解释为: function

下面是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
未定义的

这是因为在声明变量时,解释器会获取它。因此,您的代码最终被解释为:

function abcd()
{
 var a;
 alert(a); //alerts undefined
 a = 5;
}
为了避免这种混淆,您可以遵循一些将事情保持在适当位置的实践,例如在函数的开头声明局部作用域(即,在函数作用域内使用关键字
var
声明的变量)变量


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

在第一个代码段中,只有一个变量。函数外部的
a
和函数内部的
a
均指全局变量


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

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

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

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


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

提升了javascript的概念。请以回答的形式解释。链接也会很有帮助。谢谢。javascript内存管理: