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

我有一个我已经建立的日历,并且在点击日历上的一天时,会运行一个function。 您可以在日历上逐月进行,并随着时间的推移生成数月。 由于日历上的每一天,无论是否显示,都使用所有“日期”的类别绑定到一个事件,我担心成千上万的“绑定”的数量。

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

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

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

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

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

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

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

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

更新:

发布之后,我想到了用本地JS测试这个的可能方法:

 function func(){ console.log("test"); } for(x=1;x<1000;x++){ $('#parent').append("
"); $("#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循环的迭代次数等),似乎事件绑定占用了非常少量的内存。

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

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

Interesting Posts