1

因此,如果我有一些模块,例如:

//test1.js
define([], function() {
    var counter = 0;

    return {
        increment: function() { counter++ }
    };
});

Requirejs 将加载此模块一次(以了解此模块的局部变量)并且永远不会再次加载?变量计数器将通过返回对象的关闭(通过增量函数)而活着?

下一个例子呢?

//test2.js
define([], function() {
    var value = 10;

    document.getElementById('asd').addEventListener('mousedown', function(e) {
        value = Math.random();
    });

    return value;
});

使用这种代码结构,这个事件永远不会被触发,因为 requirejs 只会加载/执行一次?这里导出的值将是 10 并且不能更改?所以对于这个例子,我只有一个解决方案,那就是从这个模块返回一个函数(当我想要形象地说“多次执行这个模块”这样的效果时)?

那么这是正确的方法吗?

//test3.js
define([], function() {
    return function() {
        return Math.random();
    };
});

//test4.js
define(['test3'], function(test) {
   document.getElementById('asd').addEventListener('mousedown', function(e) {
        alert(test());
   });
});

随意张贴任何其他你觉得对 Requirejs 感兴趣的陷阱。

4

2 回答 2

0

像这样的东西怎么样:

define([], function() {
    var value = 10;

    document.getElementById('asd').addEventListener('mousedown', function(e) {
        value = Math.random();
    });

    return {
        getValue: function(){return value;}
    };

});

变量 value 将在 define 函数内部保留其状态,但当它由 define 返回时,结果由永远不会更新的值(而不是 ref)传递。

您可以返回一个方法,而不是这样做,该方法会在您调用它时为您获取当前值。这意味着您可以检索更新的值

于 2013-08-25T22:45:21.940 回答
-1

最后它很容易理解。requireJs 所做的就是评估传递的函数并将相同的结果返回给每个需要它的模块。因此,如果您需要最后一次 mousedown 的结果,则必须返回保存该值的对象或返回该值的函数:

define([], function () {
  var result = {value:10};
  //the listener is bound when the module loads, maybe you should wrap this in domLoad listener as well   
  document.getElementById('asd').addEventListener('mousedown', function (e) {
    result.value = Math.random();
  });

  return result;
});

define(['test2'], function (test2) {
  var value = test2.value;
});

define([], function () {
  var result = {value:10};

  document.getElementById('asd').addEventListener('mousedown', function (e) {
    result.value = Math.random();
  });

  return result;
});

define(['test2'], function (test2) {
  var value = test2();
});
于 2013-08-26T06:36:23.807 回答