只是一個想法,但你可以創建一個autoDefine
函數,它會生成一個新的函數,然後生成所需的對象。
DEMO:http://plnkr.co/edit/zLfGkxj21S7B2SaQmMhO?p=preview
第一種方法使用new Function
,以避免在autoDefine
功能範圍創建一個封閉,以確保該name
和dependencies
變量得到垃圾收集。但是,這個方法比較慢,因爲它需要做一些字符串操作。
autoDefine("simba", ['meta',"slider", "quickview", "share", "mylife"]);
function autoDefine(name, dependencies) {
var json = dependencies.join(',').replace(/([^,]+),?/g, '"$1":$1,').replace(/,$/, '');
define(name, dependencies, new Function(dependencies, 'return eval("({"+\'' + json + '\'+"})");'));
}
這裏的另一種方法是利用封閉的,但是如果RequireJS不會釋放工廠函數執行一次,依賴陣列將保持在內存中。
function autoDefine2(name, dependencies) {
define(name, dependencies, function() {
var i = 0,
len = arguments.length,
o = {};
for (; i < len; i++) {
o[dependencies[i]] = arguments[i];
}
return o;
});
}
這裏有performance tests那就說明autoDefine2
執行方式比autoDefine
更好。
嗨,我不知道保留依賴數組與功能正文編碼的性能差異是什麼。我猜想JS運行時會有所不同。無論哪種方式,一旦模塊被實現,我認爲沒有什麼能夠阻止AMD框架刪除工廠功能。這也可以釋放封閉的陣列。 – 2013-04-25 21:37:59
不幸的是,這兩種解決方案都不能編譯@ paulgrime的解決方案。不知道爲什麼。你的解決方案提出錯誤'ENOENT,沒有這樣的文件或目錄'試圖找到'simba.js'。 – ThomasReggi 2013-04-25 22:29:48
我想如果模塊名稱作爲第一個參數傳遞給'define',那麼第二個參數需要是依賴數組。 – 2013-04-25 22:36:46