将方法分配给变量和问题

Assigning method to variable and problems with this

本文关键字:问题 变量 方法 分配      更新时间:2023-09-26

我有这段代码:

function A(){
    this.count = 0;
}
A.prototype.inc = function(){
    this.count++;
}
var a = new A();
a.inc();
var f = a.inc;
f();

最后一行无法按我的预期工作,因为thisWindow 类型的对象。这只是你不应该做的事情 - 将方法分配给变量,以防它们使用this

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

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

这是JavaScript中著名的"丢失绑定"。

你必须做:

f = a.inc.bind(a);

因为如果你说

f = a.inc;
f();

然后当f运行时,this不绑定到a。 它绑定到全局对象,该对象window

规则是,如果你说a.fn(),那么在函数内部,this绑定到a,但如果你只是说fn()g(),即使g === a.fn,那么在函数内部,this绑定到全局对象,这是window

若要在调用函数时将this显式绑定到a,必须使用 a.inc.bind(a)

如果您不想使用bind但想使用自己的函数,那也没关系。 你会做:

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

或其他形式:

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

这样,fn是一个捕获上下文的闭包,并且能够使用 a ,它在作用域链中的某个作用域中。

在JavaScript中,"方法"并没有真正绑定到对象。它只是一个存储在属性中的函数。当您使用点表示法调用它时,会发生this的绑定,因此,如果将该方法分配给变量,则它不起作用。

函数

上有一个名为 bind 的方便内置方法,允许您将this永久绑定到值。如果这样做:

var f = a.inc.bind(a);

你会得到你想要的行为。

使用内联函数也可以工作,因为它捕获a,并且您仍然使用点表示法来调用该方法,该方法会正确地将this绑定到对象。