在不同的上下文中运行setTimeout?

时间:2016-01-30 12:14:14

标签: javascript scope settimeout

是否可以使用setTimeoutcall在其他上下文中运行apply函数?我试过了,但是他们回复了错误说"非法调用"。



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!!




2 个答案:

答案 0 :(得分:2)

Function.callFunction.apply可让您更改函数内this关键字的绑定。但是当你使用setTimeout时,你不需要这样做,因为setTimeout根本不使用this - 如果确实如此,你就不应该知道它。< / p>

相反,您想要更改函数本身内this的含义。您可以使用Function.bind

执行此操作
setTimeout( myobjvar.myfun1.bind(myobjvar), 1000);

这与以下任何一个基本相同:

setTimeout( function(){ myobjvar.myfun1() }, 1000);
setTimeout( function(){ myobjvar.myfun1.call(myobjvar) }, 1000);

答案 1 :(得分:1)

您可以使用.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);