如果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/
答案 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))