javascript - 事件监听器是否需要位于 IIFE 内部?

标签 javascript jquery events iife

我经常看到很多事件监听器代码都包裹在IIFE (function(e){}()) 里面我觉得没有必要将事件监听器保留在 IIFE 中。例如:

没有 IIFE

jQuery(window).on("load", function(){
    console.log("inside plain load");
});

使用 IIFE

(function(){
    jQuery(window).on("load", function(){
        console.log("inside wrapped load");
    });
}())

如果我们将上述代码一起包含在一个 js 文件中,则在加载事件时它们仅根据编写的顺序执行。

我知道 IIFE 会调用自身,但是在其中设置事件监听器有什么用呢?无论如何,只有当事件发生时它才会触发。

  • 是否需要将事件监听器封装在 IIFE 中?
  • IIFE 内的事件监听器真的是一个好的做法吗?

最佳答案

对于你的例子来说没有区别。

使用 IIFE 的主要原因是为了防止全局范围内的变量泄漏。

(function(){
    let notLeakedVariable = 'something'
    jQuery(window).on("load", function(){
        console.log("inside wrapped load");
        console.log(notLeakedVariable)
    });
}())

如果没有 IIFE,您将在全局范围内泄漏变量。

通过包装监听器,您甚至可以对多个监听器进行分组,并且它们将通过闭包共享相同的范围。

(function(){
    let sharedVariable = 'something'
    jQuery(window).on("load", function(){
        console.log("inside wrapped load");
        // sharedVariable is accessible 
    });

    jQuery(selector).on("click", function(){
        // sharedVariable is accessible 
    });
}())

关于javascript - 事件监听器是否需要位于 IIFE 内部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61680387/

相关文章:

javascript - 如何使用 styled-components 设置 Material ui Drawer 组件的背景颜色?

无法从 jquery 对象调用的 Javascript 方法?

vb.net - 如何检查是否会引发事件?

java - 如何实现javafx鼠标事件 "push and hold"?

c# - 为什么要通过变量引用事件?

javascript - 更改 ng-options 列表时 ng-init 不工作

javascript - 需要限制用户检查每个内表中的连续复选框

javascript - 隐藏和显示按钮 javascript

php - WooCommerce:隐藏付款按钮,直到选择发货

javascript - jQuery width() 和 height() 对于 img 元素返回 0