未定义的对象通过Requirejs传递

时间:2012-08-16 16:02:28

标签: javascript requirejs

我正在使用Requirejs在我们的网络应用中加载JavaScript。问题是我正在将一个undefined对象传递给一个模块,当在其他模块中使用时,该模块被完全实例化。

好的,这是设置。我的main.js文件requirejs在启动时运行:

require.config({
    baseUrl: "/scripts",
    paths: {
        demographics: "Demographics/demographics",
        complaints: "Complaints/complaints",
    }
});

require(["templates", "demographics", "complaints", "crossDomain"], function (templates, demographics, complaints) {
    "use strict";

    console.log("0");
    console.log(demographics === undefined);

    demographics.View.display();
});

很多配置都被剥离到了这个问题的核心文件中。

这是Demographics.js

define(["ko", "templates", "complaints", "globals", "underscore"], function (ko, templates, complaints, globals) {

    // Stuff removed.
    return {
        View: view
    };
});

Complaints.js

define([
    "demographics",
    "ko",
    "templates",
    "complaints",
    "visualeffects",
    "globals",
    "webservice",
    "underscore",
    "typewatcher",
    "imagesloaded"],
    function (demographics, ko, templates, complaints, visualeffects, globals, webservice) {
        "use strict";


        console.log("1");
        console.log(demographics === undefined);
    return {
        View: view
    };
});

问题是这个问题 - 在Complaints.js中,通过demographics配置传递的define参数为undefined。控制台注销告诉我“人口统计数据=== undefined”是true

但是,当main.js文件执行时,传递给它的demographics参数不是未定义的,正如预期的那样,它是一个实例化的对象。

现在我陷入困境,因为我无法在complaints.js中看到人口统计信息变量未定义的原因。请问有人能找到我想念的东西吗?

6 个答案:

答案 0 :(得分:59)

你有一个循环依赖。 demographics模块取决于complaintscomplaints取决于demographics。根据{{​​3}}:

  

如果定义循环依赖(需要b和b需要a),那么在这种情况下调用b的模块函数时,它将获得a的未定义值。

如果无法删除循环依赖关系,解决方案是根据需要异步地要求另一个模块中的一个(例如,在实例化视图时,而不是在执行定义视图的模块时)。同样,documentation很好地涵盖了这个主题。

答案 1 :(得分:28)

另一种情况是,当您在定义模块时意外键入require而不是define时,请花一些时间注意这一点。

答案 2 :(得分:11)

我有类似的问题。就我而言,在定义模块时,我写道:

define('some_dependency', ...

而不是

define(['some_dependency'], ...

答案 3 :(得分:4)

另一个可能的原因是实现模块的接口(AMD,CommonJS),但忘记返回任何内容。我刚刚那样做了。

答案 4 :(得分:0)

在事后看来可能看起来很明显的另一个可能原因是模块代码中的错误。就我而言,我试图从未定义的变量中获取属性。该错误记录在控制台中,但出于某种原因,我没有看到它/将其误认为是未定义的模块错误。

答案 5 :(得分:0)

我刚刚遇到另一个原因:

define(function () {
    return {};
}()); // <-- notice the '()' typo.

这&#34;拼写错误&#34;导致这个问题没有JS错误,并且可能会让人感到困惑,特别是在具有许多潜在循环依赖性的复杂应用程序中。

当然,原因是&#34;拼写错误&#34;是有效的JS,它只调用你定义的函数,从而将结果传递给define(),而不是按预期传递函数。