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

Javascript 将函数传递给自执行函数的原因,javascript,jquery,Javascript,Jquery,我从一家设计公司获得了js代码,但我不理解将函数传递给自执行函数的原因 下面是代码的概要 (function(core) { if (typeof define === "function" && define.amd) { define("abc", function() { var abc; abc = window.Abc || core(window, window.jQuery, window.docume

我从一家设计公司获得了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;
});
这是先进的技术吗

基本上,…有点

在Javascript中,函数被视为一级对象。这意味着您可以通过变量之类的方式传递它们。第一部分,
(function(core){…})
,创建一个匿名函数,使用一个名为
core
的参数。函数周围的括号基本上只解析为
函数
。第二部分,
(function(global,$,doc){…})
正在创建另一个函数,该函数作为
核心的值立即传递到对第一个函数的调用中

这样说吧,事情就是这样

// 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的活动运行版本发生冲突(它通常声明自己的全局范围
$
变量)


编辑:既然第一个函数中的代码已经填写完毕,我们可以肯定地说,这样做的原因是为了在手动将依赖项传递到第二个函数之前解决依赖项并确保它们存在。从提供的代码看,这似乎是在强制存在
abc
(我假设这是某种依赖性)此外,从函数返回的
\u c
中的值似乎被用作依赖项强制执行过程的一部分,尽管我无法通过查看它来准确判断是如何使用的。

在您的示例中,它是创建对象
\u c
并将其传递给IIFE,不,它不是高级技术你能在函数(核心){}中发布一些代码吗?这可能会给我们一个线索。传递第二个函数来创建对象而不是在第一个函数中创建对象有什么好处?正如我在上一次编辑中添加的,它能够使用自定义版本的
global
$
doc
,本质上是对代码进行沙箱化,以防止它使用d默认安装jQuery(或任何其他使用
$
)并访问全局
文档
全局
范围变量。@starcookie我不是说你安装了,但从未留下评论的人。@Cᴏʀ考虑到我们在这里看到的代码,是的;它们都是未定义的。但是,我假设第一个函数调用了第二个函数,并且它提供了适当的值。从OP编写的内容来看,甚至不清楚第一个函数对第二个函数做了什么,所以这都是推测性的。我想我应该不这样做我的回答更清楚。谢谢@Shotgun的评论。我还不是100%清楚,但是你的评论帮助我更好地理解。
// 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);