2012-06-22 186 views
1

我看着這個:Returning values from nested functions in Javascriptjavascript變量作用域:從嵌套函數返回變量?

但它並沒有真正幫助我(或者我太愚蠢得到它)。

我的變量範圍有點關閉,我不明白爲什麼。我的alert()行爲不如預期。試圖在所有行上添加評論以解釋我在想什麼。

非常感謝任何意見/指針/答案!

var g = {};/is a large object with all kinds of other stuff and functions in it 

g.ding = function(){ // my problem function 
var baby = 'young'; // i thought I set a local var here 
    if(someVar==true) { // standard issue if statement 
     someAPI.class(// using an API that uses a function as its attribute 
      function(stuff){ // my anonymous function 
       baby = 'old'; // setting the var to something 
      } 
     ); 
    } 
    return baby; // returning the var 
} 

alert(g.ding()); // i expect it to say "old" but it keeps saying "young". why? 

新的編輯: 娟的接受的答案是偉大的,但是是不是還有用的setTimeout()處理異步函數調用,並從根本上讓他們同步的方法嗎?如果讀過這些的人知道我想知道的答案。謝謝。

+0

最有可能的是,因爲'function(stuff)'永遠不會運行。你的範圍看起來很好。這裏沒有任何東西證明設置'baby =「old」'的代碼行已經執行完畢。 'someVar'可能是錯誤的,或者'someAPI'永遠不會調用你傳遞它的函數。 –

+0

好吧,我最初確實用alert()函數調用了這個函數。我認爲API函數的異步元素是解決方案。 – tim

回答

6

someAPI.class(function(){})的調用可能是異步的,這意味着當someAPI.class()返回並且變量未被更改時,您傳遞給它的函數可能未被調用。

的解決方案是將變量傳遞迴回調

g.ding = function(callback){ 
    var baby = 'young'; 
    if(someVar) { 
     someAPI.class(
      // There's no guarantee of when this function is called 
      function(stuff){ 
       baby = 'old'; 
       // Call the callback, it's like a return, for async functions 
       callback(baby); 
      } 
     ); 
    } 
    // the inner function probably wasn't called yet, 
    // doesn't make sense to return this here 
    // return baby; 
} 

// Then you'd call it like this, as soon as you use an async function 
// all the functions that call it have to use callbacks for return values 
g.ding(function(value){ 
    alert(value); 
}); 
+0

感謝一羣胡安,這對我來說絕對是清楚的。總是與異步鬥爭。 – tim

+0

@tim順便說一句,'class'是一個保留關鍵字,不應該用作屬性名稱(除非你總是用'someAPI [「class」]()''我希望這不是方法的真實名稱你打電話給 –

+0

胡安,謝謝是的,我知道關於'class' - 爲了清楚起見,我簡化了代碼示例。 – tim

0

在這裏,我可以認爲你

someAPI.class(); 

必須是一個事件相關的功能(如點擊,鼠標懸停等)。所以只有當相關事件發生時纔會執行它內部的函數,從而改變變量的值。但我認爲事件不會發生,因此變量不會改變。