2016-04-19 150 views
1

假設我在ready函數中聲明瞭一個名爲foo的變量。通常情況下,當函數結束時,本地聲明的變量會被刪除嗎?如何正確存儲變量而不將其全局存儲?

我想在事件監聽器#someid中使用這個變量。我試過這個,當#someid發生點擊事件時,仍然可以訪問foo變量。

當ready函數結束時,爲什麼這個變量不被破壞,仍然可以訪問?聲明一個變量並以這種方式使用它是否安全?我不想全局聲明變量,因爲我沒有。

編輯: 這些事件監聽器及其變量存儲在哪裏?

這裏是我的JS:

$(document).ready(function() { 
var foo = 0; 

//random event listener 
$('#someId').on('click', function() { foo++; }); //increment foo 

}); 
+3

相關:[JavaScript閉包如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) –

+0

'foo'在'$的本地'範圍內(document).ready'是'click-handler'的父範圍 'function'的'outer-scope'中的變量可以在'function'中訪問 – Rayon

+0

歡迎來到SO!此外,您提供的代碼中沒有全局變量。 – evolutionxbox

回答

5

我想在 '#someid' 的事件監聽器來使用這個變量。我試過這個,當'#someid'發生點擊事件時,仍然可以訪問foo變量。

這是正確的,您的變量foo仍在範圍內,因此可以訪問。

爲什麼不是這個變量被破壞,仍然可以訪問?

因爲兩者都在就緒函數的範圍內。

我不想全局聲明變量。

你沒有,所以不用擔心。你已經聲明瞭一個變量,它是ready函數的本地變量,而不是全局變量。

+0

是的,但就緒功能只執行一次。執行一個函數後,所有的局部變量都被刪除。但事件監聽器將被多次執行,並使用一個已刪除的變量,或者我錯了嗎?當事件監聽器被定義時,是否複製了foo變量或什麼? – Benjistep

+0

**請學習關閉**。閉包就是這樣,只要有**還有一個引用**,那麼在函數調用終止後,變量將不會被刪除**。就像使用它們的其他函數一樣,並且它本身被事件偵聽器引用,它本身被它所連接的節點所引用,並被DOM引用。所以只要從全局對象到變量有這樣一個鏈,它就不會被刪除。 Aaaaa和這個變量是*不是靜態*,它屬於這個特定的函數調用。 – Thomas

+0

謝謝,這個答案有幫助! – Benjistep

相關問題