用JavaScript/Dojo构建我的库

用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

在用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作为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;
});