2011-07-15 54 views
0

我想了解爲什麼這個警報是真的?以及如何在不將參數傳遞給回調函數的情況下提醒false(如果可能的話)?將回調的範圍設置爲它的執行位置?

var a = true; 

function foo(callback){ 
    var a = false; 
    callback(); 
} 

function bar(){ 
    alert(a); 
} 
foo(bar); // Alerts true 

回答

0

此:

var a = false; 

...是本地foo功能的範圍。

此:

function bar(){ 
    alert(a); 
} 

...在變量的作用域,其中a = true被創造,因此,關閉了該局部變量的環境,從而在特定a變量。

事實上,無論您何時創建函數,都會永久保留其創建的變量範圍。

如果您將該功能傳遞到另一個環境,則無關緊要。它將始終只引用其原始變量環境。

var test0 = 0; // global variable environment 

function a() { 

    var test1 = 1; // "a()" will always retain the global environment even if you 
        //  send "a()" somewhere else 

    function b() { 

     var test2 = 2; // "b()" will always retain the environment of "a()" and the 
         // global environment, even if you send "b()" somewhere else 
    } 
} 

編輯:

爲了bar參考本地foo的變量,你可以在它們傳遞到bar作爲參數:

var a = true; 

function foo(callback){ 
    var a = false; 
    callback(a); 
} 

function bar(a){ 
    alert(a); 
} 
foo(bar); // now it alerts false 

例子:http://jsfiddle.net/dSZ4M/

...您會注意到我在bar()中給出的參數與全局變量a同名。因爲函數的參數是在函數自身變量環境之外的變量之前讀取的,所以a參數「陰影」全局變量a

因此,您不能再從bar內部讀取全球a。當然,你需要做的就是將參數的名稱改爲別的東西,比如arg或其他什麼,然後你可以參考當地arg參數和全局a變量。

+0

正是我在找的東西。無論如何在foo的本地範圍內運行回調? – user654616

+0

@ user654616:不客氣。 – user113716

+0

@ user654616:您可以從*範圍運行bar *,但它將無法引用該範圍內的變量,除非您在調用它時將它們作爲參數傳遞。我會用一個例子來更新: – user113716

3

由於您使用var當你說a = false您創建一個新的,局部範圍,a

如果您想修改更廣泛範圍內的現有變量,請刪除var