javascript - 为什么将函数定义包装在立即函数中?

标签 javascript closures

将函数定义包装在直接匿名函数中是否有任何优点?

这是来自 jsfeat 的示例图书馆:

var get_channel = (function () {
    return function(type) {
        return (type & 0xFF);
    }
})();

还是直接执行以下操作更好?

var get_channel = function(type) {
    return (type & 0xFF);
};

在这种情况下,第一个版本似乎没有优势:

  1. 它更长,更难读,
  2. 它占用更多内存,因为闭包保留了对 外部激活对象,但里面没有有用的数据,
  3. 有时它会更慢(至少在理论上),因为如果引擎必须经过更长的作用域链,则访问全局变量需要更长的时间。

最佳答案

有一些优点,但在您提供的示例中不可见。优点是可以

  1. 通过在范围内捕获数据来创建更清晰的函数,使函数逻辑不会被数据阻碍或混淆。如果需要构造数据但希望此后每次数据都相同,或者如果您希望在多个调用之间共享数据而不导致全局命名空间发生冲突,那么这尤其有用。
  2. 根据环境或某些计算选择要返回的函数。这样您就不必一遍又一遍地运行相同的计算。

例如,您可以创建一个像这样的跨浏览器XHR函数

var XHR = (function () {
        if (window.XMLHttpRequest)
            return function () {
                return new XMLHttpRequest();
            };
        else
            return function () {
                return new ActiveXObject("Microsoft.XMLHTTP");
            };
    }());

现在,XHR 的 future 调用不需要计算 if 逻辑,无论如何它总是相同的。

关于javascript - 为什么将函数定义包装在立即函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18208918/

相关文章:

javascript - 对齐屏幕 ionic html右下角的按钮

JavaScript 理解某些闭包行为

swift - 异步调用全部成功或者都不成功,如何处理

javascript - 了解在 Javascript 中称为方法和构造函数的函数的私有(private)性和作用域

reactjs - 在 React.memo 中使用 React 功能组件时如何解决闭包问题?

javascript - jQuery 替换精确数字

javascript - 从勇者斗恶龙中绘制史莱姆

javascript - Firebase JavaScript : Callback function does not return anything

reactjs - React 闭包中的 useState 值过时 - 如何修复?

javascript - Target=_blank 在 mozilla 和 IE 中不起作用