我的问题是关于回调/承诺或全局变量的更智能的解决方案/替代方案。
情况:我有一个事件驱动的程序。我知道函数A
将计算我稍后需要的值v
。 A
将在计划开始时调用。函数B
可能会或可能不会被稍后的事件触发。
问题:如何在不使用回调的情况下将v
从A
传递到B
,因为B
不应该被A
调用{1}}而是某种事件。如何避免使用全局变量(since they are bad)?
答案 0 :(得分:1)
你可以使用一个闭包。我的意思是val
在函数A的范围内,并且事件监听器可以从函数A中“注册”。由于val
将处于闭包状态,它仍然可以被事件监听器访问,例如;
function A(n) {
var but = document.getElementById("me"),
res = document.getElementById("result"),
val = Math.floor(Math.random() * n) + 1;
but.addEventListener("click", function(e) {
res.textContent = val;
res.style.backgroundColor = '#' + Math.random().toString(16).substr(-6);
});
}
A(100);
<script src="index.js" defer></script>
<label for="me">To get the ready value please click</label>
<button id="me">me..!</button>
<p id="result"></p>
如您所见,该值仅在开始时同步计算一次,但每次都会计算背景颜色。
答案 1 :(得分:0)
最好的选择是让一个封闭的范围包含两个函数可以共享的变量:
var B, A;
(function() {
//Local scope variable that is only accessible in this scope
var v = 1;
//Define function B
B = function B() {
console.log("v is", v);
};
//Define function A
A = function A() {
setTimeout(function() {
v++;
console.log("A has changed the value of v");
}, 1000);
};
})();
A(); // --> Start A, which modifies the local variable v
B(); // --> Start B before A has finished. B logs current value of local variable v
setTimeout(function() {
B(); // --> Start B after A has finished. B logs current value of local variable v
}, 2000);