この例では、私は、ウェブページのと類似の計算、と仮定している:、ボタンbuttons[i]
を計算ボタンのいずれか
この場合
|---------------|
| |
|---------------|
| 1 | 2 | 3 | * |
|---|---|---|---|
| 4 | 5 | 6 |/|
|---|---|---|---|
| 7 | 8 | 9 | = |
|---------------|
あります。 | 1 |
、| 5 |
などのボタンの実際の数は、その指標であるので、buttons[2]
は| 2 |
、buttons[7]
だろうなど、| 7 |
だろうと私はbuttons[0]
とbuttons[10]
のように、他の値を推測している、演算子ボタン(| = |
、| * |
あります、|/|
)。の表示だけで、ユーザはこれらのボタンのいずれかをクリックしたときに今、ボタンのinnerHtml
あるボタンの文字が、(結果のinnerHTML
に追加することで)電卓のresult
に追加され
、操作。私は| * |
そして、| 3 |
をクリックしたのであれば、その後| 5 |
、電卓はaddEventListener
が場に出たところです
|---------------|
| 3*5 |
|---------------|
| 1 | 2 | 3 | * |
|---|---|---|---|
| 4 | 5 | 6 |/|
|---|---|---|---|
| 7 | 8 | 9 | = |
|---------------|
ようになります。 element.addEventListener("click", func)
に電話すると、element
がクリックされるたびにfunc
が呼び出されます。それがクリックされていますときに、結果にボタンを追加するために、あなたが行うことができます:
addButtonValueToResult
buttons[i].addEventListener("click", addButtonValueToResult);
は結果にボタンの値を追加する機能です。
問題は、異なるボタンの値が異なるため、このような機能がすべての機能で機能しないことです。したがって、addButtonValueToResult
は単純な関数にすることはできません。各ボタンにはそれぞれ独自の機能が必要です。
buttons[1].addEventListener("click", add1ToResult);
buttons[2].addEventListener("click", add2ToResult);
buttons[1].addEventListener("click", add3ToResult);
...
、その後のような機能があります:そのような解決策の1つは、ループのために捨てと同じような何かを行うことです
function add1ToResult() {
result.innerHTML += "1"
}
をしかし、あなたは機能を追加する必要があるため、これは、不必要な多くの作業を要します数字ボタン(| 1 |
〜| 9 |
)とオペレータボタン(| = |
、|/|
、および| * |
)のそれぞれに対して、innerHtml
を結果に追加するだけです。さらに、ボタンのインデックスはすでに変数i
に割り当てられており、ボタン全体はbuttons[i]
のインデックスで参照できます。ボタンのインデックスi
が与えられたときに、ボタンが(buttons[i]
を介して)得られ、そのボタンの値が結果に追加されるように、各ボタンに対して自動的にプログラムを機能させることができませんでしたか?
これはまさにこのプログラムが行うことです:addValue(i)
は、ボタンの内部値自体を追加するだけではありません。 は、特別なボタンのいくつかのテストケースでも、ボタンの内部値を追加する別の関数を返します。このコードを見る:
function addValue(i) {
return function() {
if(buttons[i].innerHTML === "÷") {
result.innerHTML += "/";
} else if (buttons[i] === "x") {
result.innerHTML += "*";
} else {
result.innerHTML += buttons[i].innerHTML;
}
}
};
addValue(3)
と言っていいでしょうか。これは数字3
を結果に加える関数を返します。result
です。 addValue(9)
に電話する場合。これは数字9
を結果に加える関数を返します。result
です。関数addValue
を呼び出して、結果に実際に数字を(addValue(digit)()
)追加することができます。しかし、addEventListener
は評価結果を取得しません。それは後でボタンがクリックされたときに呼び出す機能を取ります。
JavaScriptのクロージャはどのように動作しますか?(http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Marty