在setTimeout中调用时,为什么不指向窗口

时间:2012-01-19 19:19:18

标签: javascript

如果javascript中没有函数绑定到实例,getName()如何返回john

function Person() {
    this.name = "john";
    this.getName = function() {
        return this.name;
    };
}

var me = new Person();
setTimeout(function(){alert(me.getName())}, 3000);

我虽然this会引用setTimeout来电时的窗口。

参见jsFiddle:http://jsfiddle.net/qZeXG/

2 个答案:

答案 0 :(得分:1)

这里发生的事情是setTimeout执行的匿名函数关闭me变量,这是一个Person实例。由于关闭,当稍后调用该函数时,您仍然可以引用me

当您调用me.getName()时,您正在调用Person实例上的方法,该方法将this的值设置为该函数内的me。这只是一个普通的方法调用。

请注意,在以下代码中:

var me = new Person();
setTimeout(function() {
    alert(this);
    alert(me.getName());
}, 3000);

...第一个this alert的值 window个对象。这是正在改变值的普通方法调用。

考虑最后一个例子:

var me = new Person();
var getName = me.getName;
setTimeout(function(){ alert(getName()) }, 3000);

在这种情况下,该函数也会关闭对getName的引用,但调用该变量指向的函数时不会提供有关它来自的Person实例的任何信息。因此,this getName的值将是window对象。

结论?这句话:

  

... javascript中的实例没有绑定...

......是一个错误的假设。

答案 1 :(得分:0)

this将是Person实例,因为您在getName对象上调用了me

如果您直接致电getName而不是me的财产,则this会引用该窗口。

例如:

var getName = me.getName;
alert (getName ())

alert (me.getName.call (this))