由于我对RequireJS和Node.js的理解有限(通常加上JavaScript),我通常会看一些知名JavaScript库的来源。每次看到这样的事情:为什么这个JavaScript代码(RequireJS和Node.js的模块模式)工作?
(// Wrapping
function (root, factory) {
if (typeof exports === 'object') { // Node.js
var underscore = require('underscore');
var backbone = require('backbone');
module.exports = factory(underscore, backbone);
} else if (typeof define === 'function' && define.amd) { // Require.JS
define(['underscore', 'backbone'], factory);
}
}(this, function (_, Backbone) { // Factory function, the implementation
"option strict";
function Foo() {}
return Foo; // Export the constructor
})
); // Wrapping
我能理解(希望):
- 当脚本在
<script>
标签uncluded自动执行换行代码中的匿名函数 - 此代码与RequireJS和Node.js(最初的
if
检查)一起使用;函数factory
的结果被分配给module.exports
(Node.js)或用作define
函数(RequireJS)的参数。
Q1:此代码是如何工作没有RequireJS和Node.js的? if
和else if
检查将失败,factory
函数从不执行并且脚本返回nothig。
Q2:通过this
作为root
参数的目的是什么?这是从来没有使用
你确定它没有RequireJS或Node.js吗?我对JavaScript的理解有限(这可能是错误的)[JSFiddle](http://jsfiddle.net/aM3ZT/)让我觉得你不能访问Foo() – 2013-02-08 21:17:01
@nekman啊我看到它假定至少有Backbone可用。这是聪明的 – 2013-02-08 21:18:01
@JasonSperske不能确定100%,但看看nekman的答案...... – gremo 2013-02-08 21:22:00