在Dojo中,为什么要求()已经定义的模块()?

时间:2013-05-17 13:26:59

标签: javascript dojo js-amd

我正在查看另一个人写的JavaScript代码段,

define(
    [
        "dojo/a",
        "dojo/b",
        "dojo/c",
        ...,
        "dojo/z"
    ],
    function(a, b) {
        var c = require("dojo/c");
        ...;
        var z = require("dojo/z");

        // code goes here
    }
);

我想弄清楚你为什么会这样做。这个更短的片段是不是完全相同?:

define(
    [
        "dojo/a",
        "dojo/b",
        "dojo/c",
        ...,
        "dojo/z"
    ],
    function(a, b, c, ..., z) {
        // code goes here
    }
);

2 个答案:

答案 0 :(得分:0)

导入模块一次后,您无需再次添加需求:

<script>require(['dojox/rpc/JsonRPC','dojo/store/Memory','dijit/form/FilteringSelect'],
        function(FilteringSelect,JsonRPC,Memory){

        ##your code goes here..

        });
</script>

答案 1 :(得分:0)

第一个片段中的片段不同,加载器首先将数组中传递的所有模块加载到require,并且仅在加载了数组中列出的所有模块后才执行回调。在回调中,您可以在其他代码require之前运行其他代码。

示例:

define(
    [
        "dojo/a",
        "dojo/b",
        "dojo/c",
        ...,
        "dojo/z"
    ],
    function(a, b) {
        // execute some code here
        var c = require("dojo/c");
        var z = require("dojo/z");
        // code execute here even if c and z are not loaded yet
    }
);

您的第二个片段仅在加载所有模块时执行回调。

一般来说,我会选择第二种方法,即使你需要根据某些条件加载某些模块,第一种方法也很方便。