我对以下简单代码中发生的事情感到困惑:

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的新手。

最佳答案

几件事要考虑:


valuefunction的调用方式决定!
如果在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);

10-06 05:16