用JavaScript/Dojo构建我的库
在用JavaScript创建我的库和使用Dojo时,我将利用您的帮助。 在我看来,这似乎是一个初学者的问题,但我似乎找不到问题 我正在尝试创建一个名为“edm”的库 EDM.js非常简单:用JavaScript/Dojo构建我的库,javascript,dojo,Javascript,Dojo,在用JavaScript创建我的库和使用Dojo时,我将利用您的帮助。 在我看来,这似乎是一个初学者的问题,但我似乎找不到问题 我正在尝试创建一个名为“edm”的库 EDM.js非常简单: define([ "dojo/_base/declare" ], function(declare) { var EDM = declare("EDM", { constructor: function() { console.log("Hi E
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作为edm.js文件中函数的前缀
但是,在加载index.htm文件时,我遇到了以下错误:“uncaughtreferenceerror:edm未定义”
我会调整任何方向
谢谢您应该使用Dojo AMD加载程序,而不是自己加载文件。删除以下
标记:
然后在main.js
中编写以下代码:
require([”./src/EDM“],函数(EDM){
var newObject=edm;
});
这样做的好处如下:
- 无需添加
标签,加载时会降低页面速度 - 不会将其他对象添加到全局范围
edm
对象。这就是为什么会出现ReferenceError
从评论中回答您的问题:是和否。实际上,您已经在
edm.js
中向全局范围添加了edm
,因为您没有将var
放在以下语句前面:
edm = new EDM();
但是,define()
回调仅在从require()
函数内的Dojo AMD加载程序调用时执行。因此,这实际上意味着您必须首先加载AMD模块,然后才能从全局范围访问edm
因此,在您的情况下,以下方法也适用:
require([ "../src/EDM" ], function(bla) {
var newObject = edm;
});
正如您在上面的示例中所看到的,我们将我们的模块称为bla
,但是,因为您在EDM.js
中将其添加到了全局范围,所以它现在可用。但是,为了将其添加到全局范围,必须正确加载模块
但要小心,通常不鼓励将对象添加到全局范围,因为它们可以从任何代码中进行操作,这会使调试变得困难。全局变量不是一个好主意还有很多其他原因,你可能可以在网上找到更多关于它的信息。谢谢你,迪米特里,这个方法很有效。我还有一个问题,是否可以通过某种方式在控制台(例如chrom)中访问edm对象?也许我可以在EDM.js中创建一个全局对象来公开EDM对象?是和否,您实际上已经在
EDM.js
中将其添加到全局范围中,但只有在从AMD加载程序调用它时才会执行该操作。在我的回答中可以找到更详细的解释。
require([ "../src/EDM" ], function(bla) {
var newObject = edm;
});