42

我正在使用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的参数是. 控制台注销告诉我“人口统计 === 未定义”是.demographicsdefineundefinedtrue

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

现在我被困住了,因为我不明白为什么complaints.js那个人口统计变量是未定义的。谁能发现我错过了什么?

4

6 回答 6

60

你有一个循环依赖。该demographics模块依赖于complaints并且complaints依赖于demographics. 根据文档

如果你定义了一个循环依赖(a 需要 b,b 需要 a),那么在这种情况下,当 b 的模块函数被调用时,它会得到 a 的未定义值。

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

于 2012-08-16T19:23:07.520 回答
28

另一种情况是,当您不小心键入require而不是define定义模块时,我花了一些时间才注意到这一点。

于 2013-04-10T12:25:05.927 回答
12

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

define('some_dependency', ...

代替

define(['some_dependency'], ...
于 2013-09-14T12:21:44.957 回答
4

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

于 2014-07-01T19:28:36.230 回答
1

我刚刚遇到另一个原因:

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

这个“错字”不会导致这个错误的 JS 错误,尤其是在具有许多潜在循环依赖的复杂应用程序中,可能会让人感到困惑。

当然,原因是“错字”是有效的 JS,它只是调用您定义的函数,从而将其结果传递给define()而不是按预期传递给函数。

于 2017-03-02T16:55:03.543 回答
0

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

于 2016-03-22T20:20:01.913 回答