未定义的对象通过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
模块取决于complaints
和complaints
取决于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()
而不是函数。