最近尝试研究某 jquery 插件,但是最外层的封装代码看不明白。搜索出来的文章都是各有各说,很难让我从整体上了解整段代码。请教下怎么理解下面这段代码:
01 (function(root, factory) {
02 if (typeof define === 'function' && define.amd) {
03 define('jqname', ['jquery'], factory);
04 } else if (typeof exports === 'object') {
05 module.exports = factory(require('jquery'));
06 } else {
07 factory(root.jQuery);
08 }
09 }(this, function($) {
10 /* code1 */
11 }));
一、 root 我知道是 Window 对象,那请问 01 行的 factory 对应什么对象? console 输出来是整个 /* code1 */ 的部分,网上一搜 "factory" 都是讲工厂模式的,看后对应题目的代码还是想不明白。
二、我知道下面这种 IIFE 写法
(function(){ /* code2 */ }());
(function(){ /* code2 */ })();
但是把题目的代码简化后如下
(function(par1, par2) {
/* code3 */
}(par3, par4));
那样写的话,后面的 (par3, par4) 就不是分组操作符了吧?那整段题目为什么要那样写、作用又是什么呢?
三、请问 01 行的两个参数是 "谁" 传进去的?(或者说匿名函数的参数是怎么传进去的?立即执行时函数段从哪里获取参数呢?)
四、 02 至 08 行我的理解是,检测网页的 Javascript 是使用何种规范。如果是 AMD ,必然会已声明 define 全局变量,然后 03 行会执行模块加载代码;如果是 CMD ,就会执行 05 行来加载模块。这样理解正确吗?
五、 05 行的 factory(require('jquery')) 看不懂
六、 07 行的 factory(root.jQuery) 看不懂
七、 09 行的 this 是指 Window 对象吗?
问题有点多,请赐教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.