我有一个我已经建立的日历,点击日历上的某一天,就会运行一个功能。您可以在日历上逐月进行,并随着时间的推移生成数月。由于日历上的每一天(无论是否显示)都使用所有"天的等级绑定到一个事件,"我担心"绑定的数量"建立成千上万。
//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循环的迭代次数等),似乎事件绑定占用了非常少量的内存。
答案 0 :(得分:1)
是的,他们都占用了记忆,但不是很多。只有一个功能对象。每个元素都有一个指向该对象的指针,因此它可能类似于每个元素4个字节。
正如Felix King建议的那样,你可以通过使用委托来减少这种情况,因为只有一个绑定到容器元素。但是,内存节省被时间开销增加所抵消 - 每次事件发生在容器中的任何位置时都会调用处理程序,并且必须测试目标是否与委派事件的选择器匹配。