我对以下简单代码中发生的事情感到困惑:
function foo() {
alert(this.a );
}
function doFoo(fn) {
a = "local";
fn();
}
var a = "global";
doFoo( foo );
据我了解,deFoo是上下文对象,从中调用foo,因此警报的消息应为“本地”。可行,除非我在内部声明doFoo:
function doFoo(fn) {
var a = "local";
fn();
}
现在,警报消息为“全局”。谁可以给我解释一下这个?我是Java的新手。
最佳答案
几件事要考虑:value
由function
的调用方式决定!
如果在function
下调用global-context
,则this
引用window
(在浏览器中)
如果未使用关键字variable
定义var
,则它是全局变量。
在您的示例中,函数a
中的doFoo
引用window.a
,它是local
,在调用函数时被覆盖。
function foo() {
alert(this.a);
}
function doFoo(fn) {
console.log(window.a);
a = "local"; //window.a is set to "local"
fn();
}
var a = "global"; //window.a is "global"
doFoo(foo);
//Few logs to make it clear
console.log(window.doFoo);
console.log(window.a);