2010-07-02 50 views
1

我試圖使用閉包(我認爲這是它是什麼..),我只是想用一個局部變量在某一點在未來執行的功能,如:使用閉包在將來執行一個函數?

function boo() { 
    var message = 'hello!'; 
    var grok = function() { alert(message); } 
    foo(grok); 
} 

function foo(myClosure) { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      myClosure(); 
     } 
    } 
} 

我可以通過使用全局變量等來解決這個問題,但寧願使用類似上面的東西,因爲它至少看起來更清潔一些。你如何(如果可能)做到這一點?

感謝

-----------更新--------------------

對不起,我不是明確 - 我想知道這是否是關閉的正確語法,我試了一下,似乎沒問題。謝謝。

+1

什麼問題? – kennytm 2010-07-02 20:33:10

+0

對我來說這看起來不錯,除了$ .ajax調用丟失的東西像URL。 – Pointy 2010-07-02 20:34:48

回答

0

是你想要的嗎?

var boo = (function() { 
    var message = 'hello!'; 
    return function() { 
     foo(function() { 
     alert(message); 
     }); 
    }; 
})(); 

function foo(myClosure) { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      myClosure(); 
     } 
    } 
} 

或只是

function boo() { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      alert('hello!'); 
      // do sth with json 
      // ... 
     } 
    }); // <- missed a paren 
} 

的例子是太簡單了,知道自己想要什麼BTW。

+0

-1您好Pointy ... :) – galambalazs 2010-07-02 20:40:38

0

除非你真的想使AJAX調用,setTimeout可能是沿的線條更是你正在尋找:

function foo(myClosure) { 
    setTimeout(myClosure, 8000); // execute the supplied function after 8 seconds 
} 

如果你的問題是一起的「線條更AM我創建一個封閉正確嗎?「,那麼是的,你的功能boo正在做正確的事情。

1

您現有的代碼看起來非常好,除了最後缺少的paren外。 ;)

如果您希望更深入地理解閉包的概念,可以這樣來思考:只要定義了閉包語言中的某個東西,它就會維護對其定義的本地範圍的引用。在你的代碼的情況下,$ .ajax()的參數是一個新創建的對象(「{timeout:8000,etc.}」),它包含一個新創建的函數(匿名「success 「function),其中包含對同一範圍內的局部變量(」myClosure「)的引用。當「成功」函數最終運行時,即使「foo()」很久以前運行,它也會使用該局部作用域的引用來訪問「myClosure」。這樣做的缺點是,最終可能會有大量不可用的數據被關閉 - 數據將不會被釋放,直到所有對它的引用都被刪除。

回想起來,我可能會讓你感到困惑,而不是幫助你。對不起,如果是這樣的話。 :\