将方法分配给变量和问题

时间:2016-04-24 23:11:39

标签: javascript

我有这段代码:

function A(){
    this.count = 0;
}
A.prototype.inc = function(){
    this.count++;
}

var a = new A();
a.inc();
var f = a.inc;
f();

最后一行deosn按预期工作,因为thisWindow类型的对象。这只是你不应该做的事情 - 如果他们使用this那么就为变量分配方法吗?

当我想使用一个方法作为参数时,我是否应该省略fn(a.inc),我将用于常规函数,并使用insted以下内容?

fn(function(){
    a.inc();
});

2 个答案:

答案 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绑定到您的对象。