为什么要在函数中包装函数定义?

时间:2013-08-13 12:19:51

标签: 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 个答案:

答案 0 :(得分:2)

有一些优点,但在您提供的示例中看不到它们。优点是你可以

  1. 通过在范围内捕获数据来创建更清晰的功能,使功能逻辑不被数据阻塞或混淆。如果需要构建数据但预期每次都相同,或者如果您希望在多个调用之间共享数据而不会在全局命名空间中造成冲突,这将特别有用。
  2. 根据环境或某些计算选择要返回的功能。这样可以省去一遍又一遍地运行相同的计算。
  3. 例如,您可以像这样制作跨浏览器 XHR功能

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

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