2013-07-22 37 views
0

我有以下代碼:如何參數傳遞給函數的setTimeout

function fn($){ 
    return function(){ 
    innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    show = function(){ 
     $.alert("TEST"); 
    } 
    } 
} 

但是,在一秒鐘後,該功能show在運行時,它說$是不確定的。我該如何解決這個問題?

+1

何時以及如何被'fn'叫什麼名字? (如何調用'show'?) –

+0

加載頁面,調用fn.like yui模塊。 – MarioDu

+0

如果調用'fn'時定義'''','show'應該可用。 –

回答

2

如何參數傳遞給函數的setTimeout

的setTimeout有built in mechanism添加PARAMS

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

使用它。

如果你打算使用this - 你應該小心。但這是另一個問題。

+0

請參閱代碼,我的意思是使用$ – MarioDu

1

這裏有很多東西在玩。最重要的是你的setTimeout永遠不會被調用,因爲innerFn永遠不會被調用。這應該做的伎倆。

function fn($){ 
    return function(){ 
    setTimeout(function(){ 
     $.alert("TEST"); 
    }, 1000); 
    } 
} 

fn(window)(); //triggers your alert after 1000ms 
+0

我在別的地方叫innerFn,這只是一個例子。我想知道,像上面的代碼一樣,如何實現? – MarioDu

+0

在您當前的示例中,您的show函數可以訪問$ variable,因爲它位於「父」範圍內。您的實際代碼中必須有其他內容。 –

1

您的代碼是沒有任何意義的,因爲什麼被稱爲:

function fn($){ 
    return function(){ 
    innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    show = function(){ 
     $.alert("TEST"); 
    } 
    } 
} 

比方說,我打電話fn傳遞window,則返回一個功能,我可以執行。但是因爲這個函數只包含函數聲明 - 你也忘記了var所以你污染了全局範圍,那很糟糕 - 什麼都不會發生。

你需要至少一個函數調用中,如:

function fn($){ 
    return function(){ 
    var innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    var show = function(){ 
     $.alert("TEST"); 
    } 

    innerFn(); 
    } 
} 

fn(window)(); 

,這將作品。但是,這絕對是多餘的。您可以只有:

function fn($){ 
    return function(){ 
    function show(){ 
     $.alert("TEST"); 
    } 

    setTimeout(show, 1000); 
    } 
} 

獲得相同的結果。但是,如果您的目標僅限於setTimeout的參數,則可以使用bind。如文檔所述,您可以使用第3個參數setTimeout,但似乎是not supported in IE for legacy reason

所以,用bind意志爲轉移的例子如下:

function show() { 
    this.alert('test'); 
} 

setTimeout(show.bind(window), 1000); 

還要注意window是默認的全局對象,所以平時你沒有這樣做,只是alert就夠了。不過,我想這不是你的實際代碼,而只是一個簡單的測試,正如警報的字符串所示。

如果你喜歡有window作爲第一個參數,而是和你不感興趣的上下文對象this,你可以這樣做:

function show($) { 
    $.alert('test'); 
} 

setTimeout(show.bind(null, window), 1000); 
相關問題