JavaScript

时间:2017-08-28 09:27:49

标签: javascript callback promise global-variables

我的问题是关于回调/承诺或全局变量的更智能的解决方案/替代方案。

情况:我有一个事件驱动的程序。我知道函数A将计算我稍后需要的值vA将在计划开始时调用。函数B可能会或可能不会被稍后的事件触发。

问题:如何在不使用回调的情况下将vA传递到B,因为B不应该被A调用{1}}而是某种事件。如何避免使用全局变量(since they are bad)?

2 个答案:

答案 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);