javascript を利用するにあたって、グローバルな変数/関数を定義したり、それらをイベント属性からコールする方法は、初心者にも分かりやすく古くから用いられた方法ですが、外部ライブラリを用いたり、複数人開発を行っていく中で、これらのコンフリクトが不安材料になります。
<script>
var messages = ["Foo", "Bar"];
function displayMessages() {
alert(messages.join("|"));
}
</script>
....
<input type="button" value="Display" onclick="displayMessages();" />
以下のように、無名関数ブロック内でイベントハンドラを使ったコーディングを行う事で、グローバル汚染を回避できます。
<input type="button" value="Display" id="displayButton" />
<script>
(function() {
// この無名関数ブロック内で定義した変数/関数は、外からはアクセスできません。
var messages = ["Foo", "Bar"];
function displayMessages() {
alert(messages.join("|"));
}
document.getElementById("displayButton").onclick = function() {
displayMessages();
}
})();
</script>
...
シンタックスがわかりづらいですが、関数名が (function() {}) になっていると考えると、イメージしやすいと思います。
function displayMessage(str) {
alert(str);
}
// 以下のコードは同じように動きます。
displayMessage("Foo");
(function(str) { alert(str); })("Foo");
よく知られたところでは Prototype.js と jQuery の変数 $ のコンフリクトがありますが、同様の方法で回避することができます。
(function($) {
// この無名関数ブロック内では $ は jQuery です。
})(jQuery);
jQuery.noConflict() で $ を別名へアサインする方法はありますが、ページ全体のグローバル変数として定義し「jQuery 使うときはこの変数名を使う」といったコーディングは避けた方がよいでしょう。