我刚刚阅读了Ben Cherry撰写的一篇关于JavaScript 范围和提升的很棒的文章,他在其中给出了以下示例:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
使用上面的代码,浏览器会提示“1”。
我仍然不确定为什么它返回“1”。他说的一些事情浮现在脑海中:所有的函数声明都被提升到顶部。您可以使用函数作用域变量。仍然没有为我点击。
我刚刚阅读了Ben Cherry撰写的一篇关于JavaScript 范围和提升的很棒的文章,他在其中给出了以下示例:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
使用上面的代码,浏览器会提示“1”。
我仍然不确定为什么它返回“1”。他说的一些事情浮现在脑海中:所有的函数声明都被提升到顶部。您可以使用函数作用域变量。仍然没有为我点击。
函数提升意味着函数被移动到其作用域的顶部。那是,
function b() {
a = 10;
return;
function a() {}
}
将由 interpeter 重写为此
function b() {
function a() {}
a = 10;
return;
}
很奇怪吧?
此外,在这种情况下,
function a() {}
表现与
var a = function () {};
所以,本质上,这就是代码所做的:
var a = 1; //defines "a" in global scope
function b() {
var a = function () {}; //defines "a" in local scope
a = 10; //overwrites local variable "a"
return;
}
b();
alert(a); //alerts global variable "a"
您必须记住的是,它会在执行之前解析整个函数并解析所有变量声明。所以....
function a() {}
真的变成
var a = function () {}
var a
强制它进入局部作用域,而变量作用域是贯穿整个函数的,所以全局 a 变量仍然是 1,因为你已经通过将 a 声明为一个函数而进入局部作用域。
该函数a
在函数内部被提升b
:
var a = 1;
function b() {
function a() {}
a = 10;
return;
}
b();
alert(a);
这几乎就像使用var
:
var a = 1;
function b() {
var a = function () {};
a = 10;
return;
}
b();
alert(a);
该函数是在本地声明的,并且设置a
只发生在本地范围内,而不是全局变量。
function a(){}
首先被提升,它的行为类似于var a = function () {};
,因此在本地范围内a
被创建。a=10
,您设置的是局部变量a
,而不是全局变量。因此,全局变量的值保持不变,您会收到警报 1
function a() { }
是一个函数语句,它创建一个函数a
局部变量b
。
解析函数时会创建变量,而不管var
or 函数语句是否被执行。
a = 10
设置这个局部变量。