2011-05-24 73 views
7

我想用我的自定義作用域調用window.setTimeot函數,所以我使用call方法,但出現錯誤。javascript setTimeout調用錯誤

function foo() { 
    this.bar = function() { 
     console.log("keep going"); 
     window.setTimeout.call(this,this.bar,100); 
    } 
    this.bar(); 
} 

new foo; 

下的Firefox此打印到控制檯只有1號線,然後什麼都沒有,和谷歌在Chrome瀏覽器,它拋出一個TypeError

我的代碼有什麼問題?

回答

8

使用call在這裏沒有幫助:它調用setTimeout與您的this對象,但回調函數本身仍然從全局範圍調用。你真正想要做的是這樣的:

function foo() { 
    var self = this; 
    this.bar = function() { 
     console.log("keep going"); 
     window.setTimeout(function() { self.bar(); }, 100); 
    } 
    this.bar(); 
} 

編輯:如果你真的想類似call方式的東西,你可以使用bind結合了功能this值:

window.setTimeout(this.bar.bind(this), 100); 

但是,這是所有瀏覽器尚未支持的新ECMAScript 5規範的一部分。

+0

謝謝,我知道這種方式的工作原理,我正在嘗試使用'call'。 – 2011-05-24 14:55:36

+1

@omnosis:你不能爲此使用'call'。你正在尋找的是['bind'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind),它是新ECMAScript 5規範的一部分。使用它,你可以這樣做:'window.setTimeout(this.bar.bind(this),100)'。 – casablanca 2011-05-24 14:57:55

+0

非常有意義。我犯了同樣的錯誤,在'setTimeout'上使用'call'是沒有意義的,因爲你不是想改變'setTimeout'的'this',而是作爲參數傳遞的函數。乾杯 – chiliNUT 2015-07-29 22:28:09