2017-08-28 8 views
0

私の質問は、コールバック/約束またはグローバル変数の代わりのスマートな解決法です。JavaScriptのコールバック/プロミスまたはグローバル変数の代替手段

状況:私はイベント駆動のプログラムを持っています。私は関数Aが後で必要となる値vを計算することを知っています。 Aはプログラムの開始時に呼び出されます。機能Bは、後でイベントによってトリガーされる場合とされない場合があります。

質問:BAではなく、いくつかのイベントによって呼び出されることはありませんので、私は、コールバックを使用せずにBAからvを渡すことができますどのように。グローバル変数(since they are bad)の使用を避けるにはどうすればよいですか?

+1

'B'が' A'のスコープにない場合、グローバル変数は一般的に唯一のオプションです。彼らは過度に使われるべきではありませんが、時には彼らは正しいことです。 – Barmar

+0

@Barmarご意見ありがとうございました。私はこの質問に対する答えであることを恐れていました。しかし、待ちましょう。たぶん、私たちが考慮しなかったことの他の提案があります。 – User12547645

+0

'A'はシンクですか、非同期ですか? 「A」の呼び出し元は、何らかの形で「B」に値を単に注入することができますか?イベントハンドラとして 'B'を設定するとき?両者の間に何かが共有されていますか?彼らはどちらも同じクラスのメンバーですか? – deceze

答えて

0

最善の選択肢は2つの機能が共有できるという変数で、閉じた範囲を持つことです。

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

+0

Emilさん、本当にありがとうございます。良いアイデアですが、 'A'と' B'が同じファイルにある場合にのみ動作します。彼らはプログラムの2つの全く異なる部分にあるかもしれません。 Btw:自己呼び出し関数を使用せずにこれを行うことができます。[let'を使用している場合は](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/let)、これは関数スコープを使用していないためです。 – User12547645

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

これは興味深い考えです。ありがとうございました – User12547645

関連する問題