只是一个想法,但您可以创建一个autoDefine
函数,该函数将生成一个新函数,然后生成所需的对象。
演示: 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;
});
}
以下是性能测试,表明其autoDefine2
性能优于autoDefine
.