Requirejs,意思是“Requirejs加载每个模块一次”

时间:2013-08-25 22:25:26

标签: javascript requirejs amd

所以,如果我有一些模块,如:

//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感兴趣的其他陷阱。

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样:

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

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

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

});

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

您可以返回一种方法,该方法可以在您调用时获取值的当前值。这意味着您可以检索更新的值

答案 1 :(得分:-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();
});