Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery—当一次将事件绑定到多个元素时,是否为每个元素创建新实例?_Javascript_Jquery_Javascript Events_Event Handling - Fatal编程技术网

Javascript jQuery—当一次将事件绑定到多个元素时,是否为每个元素创建新实例?

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 让我们改变一下 现在-改变之

我的页面中有100个按钮(每个按钮都有类按钮)

此外,我还有一个单个按钮,用于准备所有其他按钮

<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
unique
Function
实例

为什么
101

好的,jQuery所做的是第一次将处理程序绑定到元素时,它会在内部为每个元素创建一个唯一的泛型处理程序。这是事件发生时实际调用的处理程序,处理所有事件类型

处理函数从未实际绑定到元素

因此,调用泛型内部处理程序时,将分析发生的事件,并查看是否有任何处理程序使用与该事件类型匹配的
.bind()
与给定元素关联。如果是,它将调用传递的处理程序

现在假设您绑定了另一个处理程序:

$(".btn").bind('mouseenter',function () {
    $(this).css('color','blue');
});
…由于我们绑定到相同的元素,它们已经有了必要的内部处理程序,不需要创建另一个。因此,所发生的一切就是您传递的函数在内部被引用,并在需要时由泛型内部处理程序调用


因此,考虑到上面的代码片段,现在存在
102
unique
Function
实例。

如果您执行以下操作:

for (someiterations)
{
    $(myobj).bind("click",function()
    {
        // ...bla...
    });
}
在这种情况下,每次迭代都要创建一个新函数。 在您的函数中,这不会发生,因为您正在将函数传递给一个参数,因此有一个地方存储了它的引用(是函数参数),它将执行以下操作:

function(event) {

    bindTheClickevent();

}
for (iterations)
{
    myob.addEventHandler(event, funcref);
}
所以现在应该可以了:

  • 不这样认为,但不确定语法
  • 正如我所解释的
  • 不,因为它在全局范围内,并且没有分配给实例,所以可以将其视为常量,而不是变量

  • 注意:匿名函数不会被释放,它由事件处理程序引用。

    ???你在干什么?让DOM 0事件处理程序只绑定另一个事件处理程序没有多大意义。。。这只是某种浏览器行为研究课题吗?@Pointy,你好。我只是给出了一个简单的情况(不是在现实生活中),我想学习这个行为,也就是说,您正在传递一个jQuery对象