Javascript中的事件中引用的本地函数会发生什么变化?

Javascript中的事件中引用的本地函数会发生什么变化?,javascript,jquery,jquery-mobile,Javascript,Jquery,Jquery Mobile,我想我错过了javascript中非常重要的一点 var gl = 10 $(document).ready(function() { var obj = {} obj.test = function() { gl++ var lc = gl function y() { alert('local = ' + lc) } (function() {

我想我错过了javascript中非常重要的一点

var gl = 10
$(document).ready(function() {
    var obj = {}
    obj.test = function() {
        gl++

        var lc = gl
        function y() {
            alert('local = ' + lc)
        }

        (function() {
            var k = lc + 1
            $('#button').click(function() {
                alert('local anonymous = ' + k)
                y()
            })                  
        })();

    }

    obj.test()
    $('#button').off()
    obj.test()          
})
在上面的场景中,我定义了一个对象“obj”,并为此对象创建了一个方法“test”。在方法内部,我有一个本地函数“y()”,该函数由附加到按钮的“click”事件使用。此外,单击事件将附加到匿名函数中

然后我调用'test()',从按钮取消订阅'click'事件,并再次调用'test()。结果,我收到预期的local=12和local anonymous=13

然而,我不明白javascript在内存中做了什么,尤其是在这些步骤中的每个步骤中对函数“y()”和匿名函数

我的具体问题如下,但如果您能解释整个流程,我将非常感谢

因此,当我删除了引用第一个“obj.test()”的所有事件时。在这种情况下,我想这只是“点击”事件。javascript会破坏“obj.test()”作用域和所有函数,包括匿名函数作用域吗?我需要关心其他事情吗?

我的用例:我正在创建具有不同页面行为的动态页面加载,因此我希望在全局对象方法中为每个页面分离javascript,并且在加载新页面后,我希望分离上一页面的所有事件并调用行为函数。但我突然意识到,我并不真正了解javascript是如何工作的,而且这种方法可能会导致巨大的内存泄漏。:--)


非常感谢

当您使用
.off
解除单击事件的绑定时,
lc
k
y()
在运行gc时,浏览器可以在该时间点进行垃圾收集(gc)。在下一行中,您调用了
obj.test()
,因此此时将无法对
obj
进行垃圾收集,因为您在取消绑定click事件后再次运行了它
lc
k
y()
现在在与第一次调用obj.test不同的作用域中再次定义,原始的仍然可以自由地进行gc,但新的不能。如果单击事件随后解除绑定,
lc
k
y()
、以及
obj
将不再被任何对象引用,因此gc将免费使用

上面的内容有点混乱,我会尽量让它更清楚

只要
obj
中的某个内容引用了由
obj.test()。当由于调用
obj.test()
而绑定事件时,事件处理程序引用
obj.test()
范围内的变量,并且元素是dom的一部分,因此在事件不再绑定到元素之前,
obj
不能被垃圾收集

下面是一个例子:

(function(){
    var a = 1;
    function doA() {
        a++;
    }
    $("#myEl").click(doA);
})();

只要myEl上存在点击事件,
a
doA
就不能被垃圾收集。

这可能有助于解释如何/为什么这样做:…谢谢你的回答。现在清楚了!对于动态页面加载,您个人有什么建议:使用一个javascript文件并提前为所有页面注册所有事件(对于简单的移动问答游戏,假设为20页),或者取消订阅上一页面的所有事件并订阅当前页面(不确定实际情况下是否安全)?这取决于页面的内容。听起来你正在做的事情实际上可以让相同的事件处理所有页面