你好,我被困在一个我不明白的情况下

这是代码

function car(speed) {
    this.speed = speed;
    this.accelerate = function() {
        this.speed += 1;
    }
}

var oldcar = new car(1);

function test(cb){
  cb();
}

test(oldcar.accelerate);

console.log(oldcar.speed);
// 1

test(function(){ oldcar.accelerate(); });

console.log(oldcar.speed);
// 2


在第一个函数调用test()上,我观察到oldcar.accelerate方法中的this设置为window。

在第二种情况下,此选项已正确设置为oldcar。

我不明白如何用oldcar.accelerate而不是function(){oldcar.accelerate();来调用test(); }有所作为。

有人可以解释这种行为吗?谢谢 !

最佳答案

因为当您将方法作为回调传递时,您仅传递了方法,而不传递了它所属的对象。

在没有任何给定范围的情况下使用this时,它默认为window(或最接近的周围范围)。

正确的方法是传递整个对象,或者匿名函数有权访问整个对象。

function test(cb){
  cb();
}

test(function(){ oldcar.accelerate() });

09-18 10:06