あなたは正しい考えを持っています。ただし、変数がglobalである必要はないことに注意してください。それを使用したいすべてのコードがそれを使用できる場所でなければなりません。
たとえば、これはグローバルを作成します。
<script>
var inferno = document.getElementById("inferno");
function infernoClick () {
inferno.style.backgroundColor="red";
}
function somethingElse () {
inferno.style.color="green";
}
</script>
(これは、要素を作成するマークアップの後である必要があることに注意してくださいinferno
。)
グローバルの問題は、それらが互いに競合する可能性があることです。実際、グローバルな「名前空間」はすでに非常に混雑しています。
inferno
次のように、スコープ関数で必要なコードをラップすることで、これを回避できます。
<script>
(function() {
var inferno = document.getElementById("inferno");
function infernoClick () {
inferno.style.backgroundColor="red";
}
function somethingElse () {
inferno.style.color="green";
}
})();
</script>
そのコードは無名関数を作成し、すぐに呼び出して内部でコードを実行します。
現在inferno
、それを必要とする関数に対して「グローバル」ですが、実際にはグローバルではありません。
さらに例を見てみましょう。
<script>
(function() {
var outer = 42;
function doSomethingCool() {
var inner = 67;
document.getElementById("someElement").onclick = function() {
alert("inner = " + inner + ", outer = " + outer);
};
}
// Can't use `inner` here, but can use `outer`
alert("outer = " + outer);
doSomethingCool();
})();
</script>
そのコードはスコープ関数ですべてをラップし、outer
変数はそのスコープ関数内のどこからでもアクセスできます。また、doSomethingCool
という変数を持つ関数 がありますinner
。inner
内でのみアクセスできますdoSomethingCool
。何が行われるか見てみましょう:がクリックdoSomethingCool
されたときのイベント ハンドラーをフックします。関数を呼び出すsomeElement
のではなく、フックするだけです。
本当にクールなことは、後で誰かが要素をクリックすると、その関数がそのinner
変数にアクセスできることです。
実際、これは関数に渡す引数にも当てはまります。最後の例:
<input type="button" id="element1" value="One">
<input type="button" id="element2" value="Two">
<script>
(function() {
function hookItUp(id, msg) {
document.getElementById(id).onclick = function() {
alert(msg);
};
}
hookItUp("element1", "This message is for element1");
hookItUp("element2", "And this one is for element2");
})();
</script>
そこには、いくつかの引数を受け入れるこの関数があり、これclick
を2 回呼び出しelement1
ます。click
element2
ここで本当にクールなことは、クリックがかなり後で発生したとしても、 has hookItUp
long-since の呼び出しが返された後でも、呼び出したときに作成された関数は、hookItUp
渡した引数に引き続きアクセスできることelement1
です。 message is for element1" をクリックするとelement2
、"And this one is for element2" が表示されます。
これらは閉鎖と呼ばれます。詳細については、私のブログをご覧ください: Closures are not complex