所以,如果我有一些模块,如:
//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感兴趣的其他陷阱。
答案 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();
});