1

我们有两个由 require.js 加载(使用'define')的模块:

  1. ds.test.js
  2. ds.js

正如您可能猜到的那样,前者测试后者。ds.test.js 的序言如下,我添加了一些控制台/日志记录:

define(["ds", "test", "assert"], function (ds, test, assert) {
    console.log(arguments);
    // the rest is a 'pure' module -- 
    // no executable code outside of a returned object/map of methods

控制台/日志的输出是我所期望的:[Object, Object, Object]

ds.js 的序言(带有控制台/日志)如下:

define(["ds"], function (ds) {
    console.log(arguments);
    // the rest is a 'pure' module

然而,控制台/日志的输出是:[未定义]

为什么前者(ds.test.js)能成功加载ds,而ds.js本身却不能呢?这导致我的一个测试失败,因为 ds 返回的方法之一引用了它自身内部的一个方法,即:'ds.assoc()'。有趣的是,在 require.js 之前,我们使用了一个自制的依赖管理器,并且在相同的方法上测试没有失败——ds.js 能够引用自己。

这会是所谓的“循环依赖”问题吗?其中 ds.test.js 依赖于 ds.js,而 ds.js 依赖于自身。如果是这样,我该如何解决我的问题?

对于它的价值,ds.test.js 首先被加载——它被'test.runner.js'作为一个名为“SUITE”的全局变量拾取,其序言如下:

define(["test", SUITE], function (test, suite) {

然后加载任何测试套件(在此转换中,ds.test.js)依次加载它正在测试的模块(例如“ds”)

最后的一些背景是我在过去几周内刚刚继承了这段代码,而我正在做的是基于我们现有的另一个应用程序从我们的家庭依赖管理器到 require.js 的转换。所以我想我要求在使用诸如“你为什么使用全局变量”之类的评论进行狙击之前考虑到这一点;如果您对具体的替代方案有建议,那我很期待。

4

1 回答 1

1

(应要求添加评论作为答案。)

如果 ds 引用自身内部的方法,您不能直接调用 assoc() 的示例函数,而不是尝试使用 ds.assoc() 吗?(这也消除了 ds 加载自身的感知需求。)

于 2013-07-10T17:40:56.703 回答