我有这段代码:
function A(){
this.count = 0;
}
A.prototype.inc = function(){
this.count++;
}
var a = new A();
a.inc();
var f = a.inc;
f();
最后一行deosn按预期工作,因为this
是Window
类型的对象。这只是你不应该做的事情 - 如果他们使用this
那么就为变量分配方法吗?
当我想使用一个方法作为参数时,我是否应该省略fn(a.inc)
,我将用于常规函数,并使用insted以下内容?
fn(function(){
a.inc();
});
答案 0 :(得分:3)
这是JavaScript的着名“丢失绑定”。
你必须这样做:
f = a.inc.bind(a);
因为如果你说
f = a.inc;
f();
然后当f
正在运行时,this
未绑定到a
。它绑定到全局对象,即window
。
规则是,如果您说a.fn()
,那么在函数内部,this
绑定到a
,但如果您只是说fn()
或{{1即使在g()
时,在函数内部,g === a.fn
也绑定到全局对象,即this
。
要在调用函数时将window
显式绑定到this
,您必须使用a
如果您不想使用a.inc.bind(a)
但想要使用自己的功能,那也没关系。你会这样做:
bind
或其他形式:
function fn() {
a.inc();
}
这样,var fn = function() {
a.inc();
};
是一个捕获上下文的闭包,并且能够使用fn
,它位于作用域链的范围内。
答案 1 :(得分:1)
在JavaScript中,“方法”并不真正与对象绑定。它只是一个存储在属性中的函数。当您使用点表示法调用它时,this
的绑定会发生,因此如果将方法分配给变量,它就不起作用。
在函数上有一个名为bind
的方便的内置方法,允许您将this
永久绑定到一个值。如果你这样做:
var f = a.inc.bind(a);
你会得到你想要的行为。
使用内联函数也有效,因为它捕获a
并且您仍然使用点符号来调用方法,该方法正确地将this
绑定到您的对象。