Javascript绑定是否在不使用时占用内存?

时间:2014-04-21 20:15:37

标签: javascript jquery events javascript-events event-handling

我有一个我已经建立的日历,点击日历上的某一天,就会运行一个功能。您可以在日历上逐月进行,并随着时间的推移生成数月。由于日历上的每一天(无论是否显示)都使用所有"天的等级绑定到一个事件,"我担心"绑定的数量"建立成千上万。

//after a new month is generated, the days are rebound
TDs.off("mousedown");
TDs = $(".tableDay");
TDs.on("mousedown", TDmouseDown);

当我学习C#/ Monogame时,我学会了很快重复更新游戏元素的功能。所以,我想知道javascript是否以相同的方式工作。 Javascript引擎是否反复检查每个事件绑定以查看它是否已发生?所以结构是这样的:

function repeat60timesPerSecond(){
 if(element1isClicked){ //blah }
 if(element2isClicked){ //blah }
 if(element3isClicked){ //blah }
}

或者Javascript在事件发生时能够以某种方式实际触发函数吗?

简而言之:Javascript绑定是否仅仅通过现有的内存来占用内存?

到目前为止我的(不确定的)研究:

我已经多次尝试自己回答这个问题。首先,我做了一个jsperf test.除了测试中一致性的明显问题之外,测试并没有真正测试这个问题。它主要测试是否解除绑定比解除绑定更快。而不是创建后实际绑定占用多少内存。我无法想出一种使用这种测试服务来测试它的方法。

然后我用Google搜索了一下,发现了很多有趣的东西,但没有直接回答这个问题。我确实遇到过this回答,建议在类似情况下使用事件容器的单个事件绑定。

更新

在发布之后,我想到了一种可能的方法来使用本地JS进行测试:

function func(){
    console.log("test");
}
for(x=1;x<1000;x++){
    $('#parent').append("<div id='x"+x+"' class='child'></div>");
    $("#x"+x).on("mousedown", func);
}

console.time("timer");

for(i=1;i<1000000;i++){
    q = Math.sqrt(i);
    if(q % 1 == 0){
        q = 3;
    }
}

console.timeEnd("timer");

在玩这个之后(改变for循环的作用,改变for循环的迭代次数等),似乎事件绑定占用了非常少量的内存。

1 个答案:

答案 0 :(得分:1)

是的,他们都占用了记忆,但不是很多。只有一个功能对象。每个元素都有一个指向该对象的指针,因此它可能类似于每个元素4个字节。

正如Felix King建议的那样,你可以通过使用委托来减少这种情况,因为只有一个绑定到容器元素。但是,内存节省被时间开销增加所抵消 - 每次事件发生在容器中的任何位置时都会调用处理程序,并且必须测试目标是否与委派事件的选择器匹配。