調用displayResults
控制的事情data
不僅當函數被調用,而且當它返回時(並因此在你的回調函數被調用)。呼叫順序可能如下所示:
data = { /* interesting things */ };
displayResults(data);
delete data.queryType;
// Time passes and then your callback gets called
// but data.queryType is undefined.
我不知道您的情況的具體情況,但上面總結了可能發生的情況。
當您通過data
產生關閉時,您正在抓住data
但這並不意味着您已鎖定data
中的內容。
現在我們知道data
是從哪裏來的,爲什麼它首先被打破,我們可以考慮爲什麼它的工作原理時data
是正確的,單獨留在家中。
當您創建匿名回調函數:
function() {
alert(data.queryType);
return false;
}
你創建保存到一個參考data
(或者,更準確地說,是什麼data
點)和data
就不會被撞死一個封閉直到沒有人蔘考它爲止。變量的生命週期取決於其範圍;您的data
變量已存在於您的displayResults
函數中。但是變量只會引用(或指向)內存中的對象,並且該對象或多或少會一直存在,直到沒有人再引用它爲止。
變量名稱和被命名的對象是具有不同生存期的獨立實體。引用布魯斯李:
不要專注於手指,否則你會錯過所有的天堂榮耀。
即使它們沒有被調用指針,你也不能脫離編程中的指針。
這個函數實際上並沒有在這裏調用。它被傳遞,當它被稱爲上下文是不同的。 – QuentinUK
數據是未定義的還是data.queryType未定義? – Dennis
它可以工作,因爲點擊功能是在「數據」相同的上下文中定義的。當產生點擊事件時,它會調用這個點擊函數,並且在創建函數的範圍內查看'data'。 – buryat