2011-08-23 181 views
2

我打電話給這個函數,將結果賦給回調中的一個變量,然後記錄結果,但我一直未定義。JavaScript範圍問題

var id; 
test.getID(function(result) { 
    id=result; 
}); 
console.log(id); 

如果我將其更改爲下面的代碼,那麼我可以看到記錄的ID。

var id; 
test.getID(function(result) { 
    id=result; 
    console.log(id); 
}); 

你知道我能做些什麼來訪問getID函數的結果嗎?

+1

有可能是因爲你馬上登錄'id'。您傳遞給'getID'的回調函數可能在您的'console.log'之後執行*。這就是爲什麼第二個工作原理......你在回調完成後記錄它的工作。 – bejonbee

+0

這不是關於作用域,而是關於「時間」,我想'test.getID'正在做一些異步操作,當你嘗試記錄'id'的值時,它還沒有被分配......正在工作回調,或調用一個單獨的函數,傳遞你的'結果'... – CMS

+0

'test.getID'是否發出Ajax請求? –

回答

1

getID函數將需要調用其參數,然後纔會看到id更改。

由於您沒有提供它的實現,我們假設它是這樣的。密切關注getID的實現,它以一個函數作爲參數f,然後調用它。這是當設置id時。

var id; 
var test = { 
    getID: function(f){ 
     var result = 666; //assume result comes from somewhere 
     f(result); //Note: this is where your function is getting invoked. 
    } 
}; 

test.getID(function(result) { 
    id = result; 
}); 

console.log(id); //prints 666 
0

一個closure會爲你工作,以及:

var id, 
test = { 
    getID: function (id) { 
    this.id = id; 
    }, 
    id: -1 
}; 

test.getID((function(result) { 
    id=result; 
    return id; 
})(78)); 
console.log(id);