Javascript 为什么会有这种“这种”行为?

Javascript 为什么会有这种“这种”行为?,javascript,this,Javascript,This,你好,我被困在一个我不明白的案子里 这是密码 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); //

你好,我被困在一个我不明白的案子里

这是密码

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
在第一个函数调用测试中,我观察到oldcar.accelerate方法中的this设置为window

在第二种情况下,this被正确设置为oldcar

我不明白用oldcar.accelerate而不是函数{oldcar.accelerate;}调用test会有什么不同


有人能解释一下这种行为吗?谢谢

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

在没有任何给定范围的情况下使用时,它默认为窗口或最近的周围范围

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

function test(cb){
  cb();
}

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

因为这就是它的含义:它的含义取决于调用函数的方式。因为thisSpecificRobjectReference.fnarg等同于thisSpecificRobjectReference.fn.callThisSpecificRobjectReference,arg,而使用对函数的引用来调用它var fn=obj.fn;fnarg相当于fn.callundefined,arg wich不使用“use strict”将其设置为全局对象。同样正确的方法是向其传递一个匿名函数,然后在该调用中调用对象方法。这样的话,测试不在乎它收到了什么,只要它是一种方法。啊,好吧,你的答案完全符合托马斯的评论。ThisSpecificRobjectReference.fnarg等同于ThisSpecificRobjectReference.fn.callThisSpecificRobjectre‌​费伦茨,你这样想吧。。如果我想扇你一巴掌,我不会把我的胳膊砍下来寄给你,我的胳膊到了也不知道该怎么办。我能扇你耳光的唯一方法就是把我的整个身体交给你: