Dojo AMD加载器是否确保模块只执行一次?

时间:2013-06-13 09:16:53

标签: javascript dojo amd

在一些现有的基于Dojo的应用程序中,我看到一个模块使用以下形式的单例模式:

define([...], function(...) {
  var MyClass = declare(...);
  if (!_instance) {
    var _instance = new MyClass();
  }
  return _instance;
});

但如果我正确理解AMD,则不需要使用_instance,因为传递给define(...)调用的函数应该只执行一次......或者可能不执行?

我对AMD加载器的理解是,当通过调用“require”或“define”获取模块时,它将检查模块是否已经加载。如果尚未加载,它将加载JS,执行传递给“define”的函数,并在内部存储返回的值。如果它已被加载,它将只返回先前存储的值。

我的假设是否正确?如果是这样,在编写模块时,我们可以安全地假设给定的模块只会被加载并执行一次,我们不需要执行任何检查以查看是否已经初始化了某些内容,从而使代码更简单。

谢谢。

1 个答案:

答案 0 :(得分:3)

你是对的,但不完全是

define("my.widget", [ "dojo/_base/declare",.... ], function(declare, ...){
    return declare("my.widget", [ .. ], {
        value : "myvalue"
    });
});

这里我们定义了定义类的模块,因此当需要模块时,类声明(构造函数)被缓存,这意味着类只定义一次。但这并不意味着你可以将它用作静态,因为那只是类声明,而不是实例。

这不起作用:

require(["my.widget"], function(widget) {
    console.log(widget.value);
});

这是正确的用法:

require(["my.widget"], function(widget) {
    console.log(new widget().value);
});