從knockoutjs源碼中讀到了一個很好的能相容AMD,commonjs規範的模組定義。看代碼
//閉包執行一個立即定義的匿名函數!function(factory) { //factory是一個函數,下面的koExports就是他的參數 // Support three module loading scenarios if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') { // [1] CommonJS/Node.js // [1] 支援在module.exports.abc,或者直接exports.abc var target = module['exports'] || exports; // module.exports is for Node.js factory(target); } else if (typeof define === 'function' && define['amd']) { // [2] AMD anonymous module // [2] AMD 規範 //define(['exports'],function(exports){ // exports.abc = function(){} //}); define(['exports'], factory); } else { // [3] No module loader (plain <script> tag) - put directly in global namespace factory(window['ko'] = {}); }}(function(koExports){ //ko的全域定義 koExports是undefined 對應著上面的[3] 這種情況 var ko = typeof koExports !== 'undefined' ? koExports : {}; //定義一個ko的方法 ko.abc = function(s){ alert(s); }});//[3]中情況的調用ko.abc("msg");
非常巧妙的閉包實現了。三種方式的相容。摘出來mark一下。