为什么要写这样的?

时间:2013-09-03 07:06:53

标签: javascript node.js requirejs amd

Other Module Notes中的

requirejs.org。我们可以写一个这样的模块:

define(["require", "./relative/name"], function(require) {
    var mod = require("./relative/name");
});

或:

define(function(require) {
    var mod = require("./relative/name");
});

但为什么我不能这样写:

define(["./relative/name"], function(require) {
    var mod = require("./relative/name");
});

1 个答案:

答案 0 :(得分:1)

如果第一个参数是作为数组给出的,则它包含要在执行回调之前加载的模块列表。然后,回调函数的参数保存对这些模块的引用。

所以看看第一个例子:这里加载了2个模块require./relative/name。回调只通过参数require接受第一个回调。第二个传递给参数,但没有命名参数。但是,由于它已经加载,您可以使用var mod = require("./relative/name");在回调中获取它的引用。 1

至于第二个例子,你列出的链接显示了这个

  

此表单将使用Function.prototype.toString()来查找require()调用,并将它们与" require"一起添加到依赖项数组中,以便代码可以正常使用相对路径

所以实际上require.js将解析你的函数并查找依赖项,然后像第一个例子中那样创建一个数组。

然而,你最后一个(不工作)的例子试图混合两者。但是来自require.js'它看起来像这样:你有一个依赖./relative/name,它被传递给名为require的参数。在函数内部,您尝试获取对同一模块的另一个引用,这次是在mod的名称下。所以对于require.js一切似乎都很好,但只是得到一个模块的引用,而不是两个,就像你(错误地)期望的那样。


1 使用var mod = require("./relative/name");的同步模块加载仅在以前通过其他调用(不一定是当前模块)加载模块时才有效。

相关问题