我将帮助您在JavaScript中创建我的库并使用Dojo。 在我看来,这似乎是一个初学者的问题,但我似乎无法找到问题。
我正在尝试创建一个名为'edm'
的库EDM.js非常简单:
define([
"dojo/_base/declare"
], function(declare) {
var EDM = declare("EDM", {
constructor: function() {
console.log("Hi EDM lib")
},
sayHi: function() {
console.log("Hi EDM lib")
}
});
edm = new EDM();
return edm;
});
加载它的index.html:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.9.2/dojo/dojo.js"
data-dojo-config="async: true"></script>
<script src="../src/EDM.js" type="text/javascript"></script>
</head>
<body>
<script src="main.js" type="text/javascript"></script>
</body>
</html>
和使用edm的main.js是:
var newObject = edm;
这个想法基本上是能够使用edm作为EDM.js文件中函数的前缀。
但是,在加载index.htm文件时,我收到此错误:“未捕获的ReferenceError:未定义edm”
我会适合任何方向。
由于
答案 0 :(得分:1)
您应该使用Dojo AMD加载程序而不是自己加载文件。删除以下<script>
标记:
<script src="../src/EDM.js" type="text/javascript"></script>
然后在main.js
中编写以下代码:
require([ "../src/EDM" ], function(edm) {
var newObject = edm;
});
这样做的好处如下:
<script>
标记会降低页面速度
当然,由于没有对象在全局范围内,因此无法直接检索edm
对象。这就是你得到ReferenceError
的原因。
从评论中回答你的问题:是和否。实际上,您已将edm
添加到EDM.js
中的全局范围,因为您没有将var
放在以下语句的前面:
edm = new EDM();
但是,define()
回调仅在从require()
函数内的Dojo AMD加载程序调用时才会执行。这实际上意味着您必须先加载AMD模块,然后才能从全局范围访问edm
。
因此,在您的情况下,以下内容也可以使用:
require([ "../src/EDM" ], function(bla) {
var newObject = edm;
});
正如您在上面的示例中所看到的,我们调用了我们的模块bla
,但是,因为您已将其添加到EDM.js
中的全局范围,所以它现在可用。但是,为了将其添加到全局范围,您必须正确加载模块。
但要小心,通常不鼓励将对象添加到全局作用域,因为它们可以从任何难以调试的代码中进行操作。全局变量不是一个好主意还有很多其他原因,你可以在网上找到更多关于它的信息。