2016-04-19 108 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

相关问题