我从设计公司获得了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 )};
这是一些高级技术吗?
基本上,.... Kinda。
在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的主动运行版本相冲突(通常会声明(通常会声明)它自己的全球范围$
变量)。
edit :既然第一个功能中的代码已经填写了,我们可以肯定地说,这样做的原因是解决依赖关系并确保它们在手动传递到将它们传递到中之前存在第二个功能。从提供的代码的外观来看,这似乎是通过requient.js强制执行abc
的存在(我认为这是某种依赖性),并确保存在jQuery。此外,看起来_c
中从该函数返回的值被用作该依赖性执行过程的一部分,尽管我无法确切地看待它。