2

将函数定义包装在直接匿名函数中有什么好处吗?

这是来自jsfeat库的示例:

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

还是只执行以下操作更好?

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

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

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

1 回答 1

2

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

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

例如,你可以像这样制作一个跨浏览器的XHR 函数

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

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

于 2013-08-13T12:21:48.997 回答