我想了解爲什麼這個警報是真的?以及如何在不將參數傳遞給回調函數的情況下提醒false(如果可能的話)?將回調的範圍設置爲它的執行位置?
var a = true;
function foo(callback){
var a = false;
callback();
}
function bar(){
alert(a);
}
foo(bar); // Alerts true
我想了解爲什麼這個警報是真的?以及如何在不將參數傳遞給回調函數的情況下提醒false(如果可能的話)?將回調的範圍設置爲它的執行位置?
var a = true;
function foo(callback){
var a = false;
callback();
}
function bar(){
alert(a);
}
foo(bar); // Alerts true
此:
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
...您會注意到我在bar()
中給出的參數與全局變量a
同名。因爲函數的參數是在函數自身變量環境之外的變量之前讀取的,所以a
參數「陰影」全局變量a
。
因此,您不能再從bar
內部讀取全球a
。當然,你需要做的就是將參數的名稱改爲別的東西,比如arg
或其他什麼,然後你可以參考當地arg
參數和全局a
變量。
由於您使用var
當你說a = false
您創建一個新的,局部範圍,a
。
如果您想修改更廣泛範圍內的現有變量,請刪除var
。
正是我在找的東西。無論如何在foo的本地範圍內運行回調? – user654616
@ user654616:不客氣。 – user113716
@ user654616:您可以從*範圍運行bar *,但它將無法引用該範圍內的變量,除非您在調用它時將它們作爲參數傳遞。我會用一個例子來更新: – user113716