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

Javascript Requirejs,它的意思是“Requirejs加载每个模块一次”,javascript,requirejs,amd,Javascript,Requirejs,Amd,如果我有一些模块,比如: Requirejs将加载此模块一次,以了解此模块的局部变量,并且不再加载?变量计数器将通过从返回对象到增量函数的闭包而处于活动状态 下一个例子呢 使用这种代码结构,不会触发此事件,因为requirejs只会加载/执行一次?这里的导出值是10,永远不能更改? 所以在这个例子中,我只有一个解决方案,那就是从这个模块返回一个函数,当我想要像执行这个模块这样的效果时,我会多次用比喻的方式说 那么这是正确的方法吗 //test3.js define([], function()

如果我有一些模块,比如:

Requirejs将加载此模块一次,以了解此模块的局部变量,并且不再加载?变量计数器将通过从返回对象到增量函数的闭包而处于活动状态

下一个例子呢

使用这种代码结构,不会触发此事件,因为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的您感兴趣的陷阱。

这样的东西怎么样:

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

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

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

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


不必这样做,您可以返回一个方法,当您调用它时,该方法将获取您的值的当前值。这意味着您可以在最后检索更新的值,这很容易理解。requireJs所做的就是计算传递的函数,并将相同的结果返回给每个需要它的模块。因此,如果需要上一次鼠标向下移动的结果,则必须返回包含该值的对象或返回该值的函数:

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();
});

在页面加载之前,解释器是否会尝试添加事件侦听器?除此之外,据我所知,每次用户单击ID为asd的元素时,都会出现一个弹出窗口,每次都会出现一个不同的随机数。但是我已经习惯了用jQuery做一些事情,所以我没有正确地检查。你能把你的答案扩大一点吗?您在没有实际回答问题的情况下随机输入了一段代码。@LukeMcGregor,但是在什么情况下我可以从这个模块获得更新的值?通过这种方式,在另一个模块中,我需要再次编写document.getElementById'asd'.addEventListener'someEvent',函数{alertmodule.getValue;};这似乎是重复的代码。不,你不需要重复代码。从define加载模块时,在HTML元素上设置侦听器。如果您调用该函数,它将每次返回10,直到您单击asd元素。之后,它将返回一个随机数;在再次单击元素之前,该数字每次都是相同的,然后它将是一个不同的随机数。调用函数不会更改值,但单击元素会更改值。
define([], function() {
    var value = 10;

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

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

});
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();
});