在JavaScript / Dojo中构建我的库

时间:2014-02-26 15:56:22

标签: javascript dojo

我将帮助您在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”

我会适合任何方向。

由于

1 个答案:

答案 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中的全局范围,所以它现在可用。但是,为了将其添加到全局范围,您必须正确加载模块。

但要小心,通常不鼓励将对象添加到全局作用域,因为它们可以从任何难以调试的代码中进行操作。全局变量不是一个好主意还有很多其他原因,你可以在网上找到更多关于它的信息。