Auto需要将一系列依赖项放入对象中

时间:2013-04-25 20:39:44

标签: javascript requirejs

无论如何都要实现自动化,真的是多余的。

define("simba", ['meta',"slider", "quickview", "share", "mylife"], function(meta, slider, quickview, share, mylife){
    var simba = {
        meta: meta,
        slider: slider,
        quickview: quickview,
        share: share,
        mylife: mylife
    };
    return simba
});

2 个答案:

答案 0 :(得分:1)

只是一个想法,但你可以创建一个autoDefine函数,它将生成一个新函数,然后生成所需的对象。

DEMO: http://plnkr.co/edit/zLfGkxj21S7B2SaQmMhO?p=preview

第一种方法使用new Function来避免在autoDefine函数范围内创建闭包,以确保namedependencies变量得到垃圾回收。但是,这种方法较慢,因为它必须进行一些字符串操作。

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

答案 1 :(得分:1)

这可能吗?

(function (deps) {
define("simba", deps, function () {
    var simba = {};
    for (var i = deps.length-1; i >= 0; i--) {
        simba[deps[i]] = arguments[i];
    }
    return simba;
});
}(['meta', "slider", "quickview", "share", "mylife"]));

虽然可能会击败RequireJS优化器,所以不确定其好处。