未定义的对象通过Requirejs传递

我正在使用Requirejs在我们的Web应用程序中加载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(); }); 

很多configuration已经被剥离到这个问题的核心文件。

这里是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 ,通过define config传递的demographics参数是undefined 。 控制台注销告诉我“人口统计数字===未定义”是true

但是,执行main.js文件时,传递给它的人口统计信息参数不是未定义的,而是按预期方式实例化的对象。

现在我卡住了,因为我不明白为什么在人口统计variables未定义的complaints.js 。 任何人都可以发现我错过了什么?

你有一个循环依赖。 demographics模块取决于complaintscomplaints取决于demographics 。 根据文件 :

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

如果你不能删除循环依赖,那么解决scheme就是按需要asynchronous地请求两个模块中的一个(例如,当视图被实例化时,而不是定义视图的模块被执行时)。 同样, 文档也很好地涵盖了这个话题。

另一种情况是当你在定义一个模块的时候不小心input了require而不是define时候,花了我一些时间来注意到这个。

我有一个类似的问题。 在我的情况下,当定义一个模块时,我写道:

 define('some_dependency', ... 

代替

 define(['some_dependency'], ... 

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

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

我刚刚遇到另外一个原因:

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

这个“拼写错误”不会导致这个错误,并且可能会让人感到困惑,尤其是在一个复杂的应用程序中有很多潜在的循环依赖。

当然,原因是“拼写错误”是有效的JS,它简单地调用你定义的函数,从而将其结果传递给define()而不是函数。