将函数传递给自执行函数的原因

3
我从一个设计公司得到了JS代码,但我不明白为什么要将一个函数传递给自执行函数。
以下是代码的概述。
(function(core) {
   if (typeof define === "function" && define.amd) {
       define("abc", function() {
           var abc;
           abc = window.Abc || core(window, window.jQuery, window.document);
           abc.load = function(res, req, onload, config) {
               var base, i, load, resource, resources;
               resources = res.split(",");
               load = [];
               base = (config.config && config.config.abc && config.config.abc.base ? config.config.abc.base : "").replace(/\/+$/g, "");
               if (!base) {
                   throw new Error("Please define base path to Abc in the requirejs config.");
               }
               i = 0;
               while (i < resources.length) {
                   resource = resources[i].replace(/\./g, "/");
                   load.push(base + "/components/" + resource);
                   i += 1;
               }
               req(load, function() {
                   onload(abc);
               });
           };
           return abc;
       });
   }
   if (!window.jQuery) {
       throw new Error("Abc requires jQuery");
   }
   if (window && window.jQuery) {
       core(window, window.jQuery, window.document);
   }
})(function(global, $, doc) {
   var _c = {};
   ...
   return _c;
});

这样编写代码是否比下面的方式更有益?
(function( core, $, undefined) { 
   ... 
} (window.core= window.core|| {}, jQuery )};  

1
在您的示例中,创建对象_c并将其传递给IIFE,并不是高级技术。 - Satpal
你能发布一些在 function(core) {} 中的代码吗?这可能会给我们一些线索。 - McCroskey
1个回答

1

这是一种高级技巧吗?

基本上,有点儿。

Javascript中,函数被视为一等对象。这意味着您可以将它们传递到变量和其他地方。第一部分 (function(core) { ... }) 创建了一个匿名函数,接受一个名为 core 的参数。括号围绕函数只是解析为 function。第二部分 (function(global, $, doc) { ... }) 创建了另一个函数,该函数立即作为 core 的值传递到第一个函数的调用中。

这样来看,以下是正在发生的事情。

// Define the first function (the one that takes core)
var firstFunc = function (core) { /* ... */ };

// Define the second function (the one that takes global, $, and doc)
var secondFunc = function (global, $, doc) { 
    var _c = {};
    /* ... */ 
    return _c;
};

// Call the first, passing in the second.
firstFunc(secondFunc);

上面的代码和您发布的代码实现了相同的功能。编写这样的代码的一个目的是将第二个函数隔离起来,以便第一个函数可以指定自己本地版本的变量 global、$ 和 doc,从而避免与其他正在运行的 jQuery 版本(通常声明自己的全局 $ 变量)发生冲突。
编辑:现在第一个函数中的代码已经填写完成,我们可以确定这样做的原因是解决依赖关系并确保它们存在于手动传递到第二个函数之前。根据所提供的代码,看起来这是通过 require.js 强制存在 abc(我假设这是某个依赖项),以及确保 jQuery 存在。此外,看起来从函数返回的 _c 值作为该依赖性强制执行过程的一部分使用,尽管我无法准确地看出它的具体用途。

通过传递第二个创建对象的函数而不是在第一个函数中直接创建对象的好处是什么? - starcookie
正如我在上次编辑中所添加的,它可以使用自定义版本的 global$doc,从而将代码隔离开来,防止其使用默认安装的 jQuery(或其他使用 $ 的库)并访问全局 documentglobal 作用域变量。 - Shotgun Ninja
@starcookie 我不是说你做了,但是没有留下评论的人。 - Shotgun Ninja
@Cᴏʀʏ 鉴于我们在这里看到的代码,是的,它们都将是未定义的。然而,我假设第一个函数调用了第二个函数,并提供了适当的值。根据OP所写的内容,甚至不清楚第一个函数是否对第二个函数执行任何操作,因此这都是推测性的。我想我应该在我的答案中更清楚地表达这一点。 - Shotgun Ninja
由于原帖作者对帖子进行了编辑,第一个函数的意图变得更加明确了。我已经相应地编辑了我的答案。 - Shotgun Ninja
1
感谢您的评论@Shotgun。我还没有完全清楚,但是您的评论帮助我更好地理解了很多。 - starcookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接