Javascript jQuery—当一次将事件绑定到多个元素时,是否为每个元素创建新实例?
我的页面中有100个按钮(每个按钮都有类按钮) 此外,我还有一个单个按钮,用于准备所有其他按钮Javascript jQuery—当一次将事件绑定到多个元素时,是否为每个元素创建新实例?,javascript,jquery,javascript-events,event-handling,Javascript,Jquery,Javascript Events,Event Handling,我的页面中有100个按钮(每个按钮都有类按钮) 此外,我还有一个单个按钮,用于准备所有其他按钮 <input type='button' onclick='bindTheClickevent()' /> 问题 1)在内存中创建了多少匿名函数的实例 2)在内存中,bindTheClickevent()函数是否将释放(GC)?-请注意,绑定在bindTheClickevent函数中被称为 3)当时,bindTheClickevent函数最终将免费提供给GC 让我们改变一下 现在-改变之
<input type='button' onclick='bindTheClickevent()' />
问题
1)在内存中创建了多少匿名函数的实例
2)在内存中,bindTheClickevent()函数是否将释放(GC)
?-请注意,绑定在bindTheClickevent
函数中被称为
3)当时,bindTheClickevent函数最终将免费提供给GC
让我们改变一下
现在-改变之后
1)如果我这样做有什么区别吗
2)在内存中创建了多少匿名函数的实例
3)绑定ClickEvent
()功能是否将免费(GC)
?-请注意,绑定在bindTheClickevent
函数中被称为。看起来在这两种情况下都只创建了一个函数实例。似乎匿名函数的引用作为每个元素的事件处理程序附加
-使用闭包显示按钮事件处理程序之间的范围共享
注意如果涉及闭包,这可能会导致有趣的行为,因为所有元素将共享相同的函数(和闭包范围)
不,您声明的函数将不会被GC'd,因为它们是全局作用域
另外
要单独附加它们(而不是通过引用),请使用.each()
在选定元素上循环,然后单独附加函数
$('.btn').each(function() {
$(this).bind('click',function() {
// each '.btn' has it's own copy of
// this anonymous function
}
});
1)在内存中,创建了多少匿名函数的实例
哪个匿名函数
对于内联onclick
,您将获得一个分配给元素的onclick
属性的函数,如下所示:
function(event) {
bindTheClickevent();
}
for (iterations)
{
myob.addEventHandler(event, funcref);
}
。。。或类似,具体取决于实施情况。当元素被取消引用或函数从onclick
属性被取消引用时,该函数对于GC是自由的
关于jQuery代码:
$(".btn").bind('click',function () {
$(this).css('color','red');
});
…虽然匿名函数是共享的,但您看不到的是,如果相关元素尚未绑定jQuery处理程序,jQuery将在内部为每个元素创建一个唯一的函数
该内部处理程序实际上是绑定到元素的,当元素接收到事件时,将调用该处理程序,分析事件,并调用最初传递的处理程序(如果需要)
这意味着100个jQuery绑定元素等于101个唯一的函数实例
为了确保使用jQuery绑定的任何处理程序都是GC的,您需要确保始终使用jQuery删除DOM元素。如果不清除,则不会清除jQuery.cache
中存储的所有数据(包括处理程序),因此它们将始终通过全局jQuery
命名空间引用
编辑:
假设有100
元素具有类btn
,并且没有任何由jQuery绑定的处理程序,那么此代码:
$(".btn").bind('click',function () {
$(this).css('color','red');
});
…将创建101
uniqueFunction
实例
为什么101
好的,jQuery所做的是第一次将处理程序绑定到元素时,它会在内部为每个元素创建一个唯一的泛型处理程序。这是事件发生时实际调用的处理程序,处理所有事件类型
处理函数从未实际绑定到元素
因此,调用泛型内部处理程序时,将分析发生的事件,并查看是否有任何处理程序使用与该事件类型匹配的.bind()
与给定元素关联。如果是,它将调用传递的处理程序
现在假设您绑定了另一个处理程序:
$(".btn").bind('mouseenter',function () {
$(this).css('color','blue');
});
…由于我们绑定到相同的元素,它们已经有了必要的内部处理程序,不需要创建另一个。因此,所发生的一切就是您传递的函数在内部被引用,并在需要时由泛型内部处理程序调用
因此,考虑到上面的代码片段,现在存在102
uniqueFunction
实例。如果您执行以下操作:
for (someiterations)
{
$(myobj).bind("click",function()
{
// ...bla...
});
}
在这种情况下,每次迭代都要创建一个新函数。
在您的函数中,这不会发生,因为您正在将函数传递给一个参数,因此有一个地方存储了它的引用(是函数参数),它将执行以下操作:
function(event) {
bindTheClickevent();
}
for (iterations)
{
myob.addEventHandler(event, funcref);
}
所以现在应该可以了:
不这样认为,但不确定语法
正如我所解释的
不,因为它在全局范围内,并且没有分配给实例,所以可以将其视为常量,而不是变量
注意:匿名函数不会被释放,它由事件处理程序引用。???你在干什么?让DOM 0事件处理程序只绑定另一个事件处理程序没有多大意义。。。这只是某种浏览器行为研究课题吗?@Pointy,你好。我只是给出了一个简单的情况(不是在现实生活中),我想学习这个行为代码>,也就是说,您正在传递一个jQuery对象