Javascript函数范围和提升
我刚刚阅读了一篇关于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() {}
}
将由中间人改写为此
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
将它强制为一个本地范围,并且变量范围贯穿整个函数,因此全局变量仍然为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
只在局部范围内,而不是全局变量发生。
上一篇: Javascript function scoping and hoisting
下一篇: whats the difference between function foo(){} and foo = function(){}?