2012-01-07 48 views
0

我是JavaScript的新手,請原諒任何不正確的術語/理解。在JavaScript中訪問方法功能中的變量

我試圖從方法ec.get中的回調函數function(thebest,all)中提取變量thebest

我已經做了一些小範圍的閱讀,我期望下面的代碼能夠正常工作,但它看起來thebest函數外部的變量與方法函數中的變量不在同一個範圍內。

var thebest = 0; 
ec.get("id", function(thebest,all) { }); 
alert(thebest); 

我也試過在外面使用不同的變量名,但它沒有區別。我如何從方法及其函數的外部訪問「最內層」thebest變量的值?謝謝!

+1

定義爲函數參數的最佳變量只存在於括號之間的函數範圍內。只有_function(thebest,all)_ {'here'} – 2012-01-07 00:57:43

回答

2

它看起來像有幾個問題在這裏:

問題1:如果你想改變在回調函數的theBest值,你不能把它當作一個參數更改。簡單變量通過值傳遞,所以如果在函數中更改它,原始內容不會更改。

問題2:假設ec.get()是一個網絡操作,它可能是異步的,這意味着通過它的回調函數直到很晚纔會被調用。這意味着,當警報觸發時,完成回調函數將不會執行。所以,它不會改變任何東西。

問題3:您無法按照您聲明的方式將參數傳遞給回調函數。這將定義這些參數,但除非ec.get()要這樣傳遞參數,否則參數在調用時不會實際存在。請記住,它是內部調用你的函數的ec.get()。僅憑它就可以決定回調得到的參數。你不能改變這一點。

問題4:在聲明具有相同的名稱作爲本地或全局變量(thebest在你的例子)你的函數的參數,創建一個名稱衝突引起爭論接管該名稱爲你的函數的範圍,並使高層變量不可訪問。通常,使用與作用域中的其他變量相同的名稱命名函數參數是個不錯的主意。它只是要求你或者其他人閱讀你的代碼時感到困惑,並對使用該名字時被修改或閱讀的內容做出錯誤的假設。要做到這一點

的一種方法如下:

var thebest = 0; 
var all = "whatever"; 
ec.get("id", function() { 
    // use the arguments "thebest" and "all" here which are available 
    // from the higher scope. They don't need to be passed in 
    alert(thebest); 
    alert(all); 
}); 
// you can't alert on the value of thebest and all here because 
// an asychronous callback won't have yet been called and 
// won't have yet modified those values 
2

如果回調的東西,立即執行(不是異步),那麼你可以簡單地爲它分配了一個不同的命名變量。例如

var theBest = 0; 
ec.get("id", function(theBestArg,all) { theBest = theBestArg; }); 
alert(thebest); 
2

你的問題是,你重新聲明theBest爲你的函數的參數。

var thebest = 0; 
ec.get("id", function(theNewBest,all) { theBest = 'new value' }); 
alert(thebest);