2012-08-27 58 views
2

我遇到了從一個函數返回值到另一個函數的需求,並且在這個簡單的任務不起作用時,我一直在困惑中摸索着我的頭腦。然後我意識到我在一個閉包函數(或匿名函數?)內運行,並且找不到有關如何從這樣的函數範圍中釋放變量的文檔。如何將一個值從closure內部返回到外部範圍?

例如,這不起作用:

function aFunc() 
{ 
    var result; 
    object.event = function(){ 
     result = true; 
    } 
    return result; 
} 

也不從封閉內返回。我需要這兩個嗎?我試圖在儘可能大的範圍內使用一個全局變量(在所有函數之外),這也不起作用。我錯過了什麼?

我不確定我是否正確使用術語閉包,我指的是匿名函數。

謝謝。

回答

4

你需要調用關閉:

function aFunc() { 
    var result; 
    object.event = function() { 
     result = true; 
    }; 
    object.event(); 
    return result; 
} 

或者,如果它運行在其他地方,這是一個時機的問題。你可以像一個承諾

function aFunc() { 
    var promise = { hasRun: false, result: null }; 
    object.event = function() { 
     result.hasRun = true; 
     result.result = true; // or something else... 
    }; 
    return promise; 
} 

// check if it has run and get the result: 

if (promise.hasRun) { 
    // access promise.result 
} 

但是,一個簡單的回調應該足夠了。既然你提到的XMLHttpRequest對象,你應該能夠回調重視其onreadystatechange事件,或傳遞一個回調aFunc

function aFunc(callback) { 
    object.event = function() { 
     var result = true; 
     callback(result); 
    }; 
} 

然後回調獲取與它有效的時間,結果調用。

+0

閉包運行,有問題的對象和事件是一個xmlhttp就緒狀態,也許我的例子混淆了事情。 – Lee

+0

然後這是一個計時問題,它在返回結果之前絕對不會運行。你需要的是返回一個_promise_,稍後你可以檢查;或者只是使用回調。 –

+0

啊我明白了。承諾會是什麼樣子? – Lee

3

您可以將一個對象傳遞給閉包,該閉包的屬性'result'將在函數調用時設置。

function aFunc (foo) { 
    object.event = function() { 
     foo.result = true; 
    } 
} 

的問題是,的result值由aFunc返回,而不是對它的引用,這意味着,所述封閉內部發生的result任何後續變化不會影響該較早返回的result

+0

上面的例子是簡化我遇到麻煩的功能。結果在閉包(?)內確定,取決於幾種情況可能會或可能不會。所以我無法將預定的結果值傳遞給它。 – Lee

+0

沒關係。重點是你分配給一個已知對象的屬性,並有權訪問結果。 – Qnan

+0

如果您在aFunc執行完成後將函數aFunc *中的局部變量賦值給某個局部變量,那麼您幾乎不可能檢索到值 – Qnan

2

這是不可能的;代碼

object.event = function(){ 
    result = true; 
} 

實際上並不執行result = true;,它只是定義了將設置resulttrue功能。在調用函數之前使用result會產生未定義的值。

解決辦法有兩個:

  1. 你可以使用一個容器(由QNAN的建議)

  2. 您可以使用回調。

第二種方式是指:如果不使用result馬上的,你讓後面object.event呼籲儘快result的你一些代碼的功能有一些有用的價值:

object.event = function(){ 
    result = true; 
    callback(result); 
} 
+0

這是有道理的。在C#中使用它們後,我熟悉回調。謝謝。 – Lee

相關問題