在不同的上下文中运行设置超时

Running setTimeout in different context?

本文关键字:运行 设置 超时 上下文      更新时间:2023-09-26

是否可以使用 callapply 在另一个上下文中运行 setTimeout 函数?我试过了,但他们返回错误说"非法调用"。

var myvar = 10;
function myfun() {
    console.log("normal run "+myvar);
}
var myobjvar = {
    myvar : 26,
    myfun1 : function() {
        console.log("context run "+this.myvar1);
    }
}
setTimeout(myfun, 1000);
setTimeout.call(myobjvar, myobjvar.myfun1, 1000) // errors out!!

Function.callFunction.apply允许您更改函数内 this 关键字的绑定。但是当你使用setTimeout时,你不需要这样做,因为setTimeout根本不使用this - 或者如果它这样做,你不应该知道它。

相反,您希望更改函数本身中this的含义。您可以使用Function.bind来执行此操作:

setTimeout( myobjvar.myfun1.bind(myobjvar), 1000);

这基本上与以下任一内容相同:

setTimeout( function(){ myobjvar.myfun1() }, 1000);
setTimeout( function(){ myobjvar.myfun1.call(myobjvar) }, 1000);
您可以使用

.bind()来设置上下文。

JSFiddle

var myvar = 10;
function myfun() {
    console.log('normal run ' + myvar);
}
var myobjvar = {
    myvar : 26,
    myfun1 : function() {
        console.log('context run ' + this.myvar);
    }
}
setTimeout(myfun, 1000);
setTimeout(myobjvar.myfun1.bind(myobjvar), 1000);