我刚刚在这里回答了类似的问题:
如何将参数传递给 setTimeout() 回调?
setTimeout 函数将上下文固定到窗口,所以不可能做你想做的事!
为此,我将 setTimeout 函数包装在另一个可以设置上下文的函数中:
myNass_setTimeOut = function (fn , _time , params , ctxt ){
return setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
var _deepResultFunction = function _deepResultFunction(){
//_deepFunction(_deepData);
_deepFunction.apply( _deepCtxt , _deepData);
};
return _deepResultFunction;
})(fn , params , ctxt)
, _time)
};
// lets try this functions :
for(var i=0; i<10; i++){
setTimeout(function(){console.log(i)} ,1000 ); // stock setTiemout in closure
}
for(var i=0; i<10; i++){
setTimeout( console.log(i) ,1000 ); // stock setTiemout direct call
}
for(var i=0; i<10; i++){
setTimeout(console.log ,1000 , i); // stock setTiemout not compatible IE
}
for(var i=0; i<10; i++){
myNass_setTimeOut(console.log ,1000 , [i] , console); // wrapped setTimeout
}
所以回答你的问题:
var person = {
first: 'joe',
last: 'doe',
getName: function(){
console.log(this.first + ' ' + this.last);
}
}
setTimeout(person.getName(), 2000);
当您启动时:setTimeout(person.getName(), 2000);
setTimeout 将在未来 2 秒(2000 毫秒)内执行第一个参数!
但是你的第一个论点的价值是什么?: 你的函数 person.getName 的结果( )
,所以它相当于:
var _arg1 = person.getName();
setTimeout(_arg1 , 2000);
这是非常不同的:
var _arg1 = person.getName;
setTimeout(_arg1 , 2000);
第一种情况是将函数的结果传递给 setTimeout 等待对函数的引用。在第二种情况下,您传递对函数的引用(很好,这是预期的),但不是在良好的上下文中!
所以,现在你必须修复上下文:核心 javascript 函数:应用
现在试试这个:
var _arg1 = function(){ person.getName.apply(person) };
setTimeout(_arg1 , 2000);
myNass_setTimeOut(person.getName , 2000 , null , person);
所以你有两个选择:
- 修复传递给 setTimeout 的每个参数的上下文。
- 使用为你做的功能
myNass_setTimeOut 函数会成功的!
现在,让我们看一些更深入的东西:
var person = {
first: 'joe',
last: 'doe',
getName: function(){
console.log(this.first + ' ' + this.last);
} ,
say : function(sentence){
console.log(this.first + ' ' + this.last + ' say : ' + sentence)
}
}
如何将参数语句传递给 setTimeout ?
var heSay = "hello !"; setTimeout(person.say(heSay) , 1000 ); heSay = "goodBye !";
// not good : execute immediatly
var heSay = "hello !";setTimeout(function(){person.say(heSay)} , 1000 ); heSay = "goodBye !";
// not good : hesay googbye
var heSay = "hello !"; setTimeout(person.say , 1000 , heSay); heSay = "goodBye !";
// not good bad context
var heSay = "hello !"; setTimeout(function(whatHeSay){person.say(whatHeSay)} , 1000 , heSay);heSay = "goodBye !";
// GOOD ! ok but not compatible with IE
var heSay = "hello !"; myNass_setTimeOut(person.say , 1000 , [heSay] , person ); heSay = "goodBye !";
// just good !
希望这对你有帮助!
编辑 :
对于现代浏览器支持绑定,请不要关心
这里所说的@dandavis