2011/01/14

jQueryプラグインの中に出てくるセミコロン「;」

jQueryプラグイン
jQueryプラグインのソースを読んでいると、無名関数の先頭にセミコロン「;」を付けているのを見かけたりします。
たとえば、fancyboxとかがそうです。

;(function($){
      ..etc
    })(jQuery);

jQueryの$関数みたいなものかな?と思いつつ、JSLintとかで文法チェックするとエラーになりますよ。
ただ、なんとなく予想はついていたので、ググってみると英語のフォーラムに書いてありました。
http://markmail.org/message/3gppon7hfmw7jqr7

ざっくり書くと、「セミコロンが先頭にあるプラグインを読み込む前に、セミコロンがちゃんと書かれていないコードがあるとバグッちゃうからつけといたよ!」ということですね。

jsでのセミコロン
jsではセミコロンの自動補完という謎の機能があるため、こんな感じの残念なソースがあります。
var hoge = "hoge";
    console.log(hoge)
この例だと、logメソッドの末尾にセミコロンがありません。
イミフwwwうはwwwwおkwwww
ただ、自動でセミコロンが補完されるので「動くことは動きます」。
var hoge = "hoge";
    console.log(hoge)
    var moge = "moge";
    console.log(moge);

ただし、こんな場合はエラーになります。

圧縮ツールとかにかけた場合
var hoge = "hoge";console.log(hoge)var moge = "moge";console.log(moge);
改行が削除されてエラーになります。

無名関数の場合
var hoge = "hoge";
console.log(hoge)
(function() {
var moge = "moge";
console.log(moge);
})();
とかそんな感じ。


なぜ文頭にセミコロンをつけるのか
文末にセミコロンをつけないソースの後ろにコピペしたpluginのソースを貼った場合(もしくはソースをYUI Compressorとかのツールで圧縮した場合)は、無駄な改行が消されて、一行のソースになったりします。
こういう場合に、直前の文でセミコロンがなくても、問題が起きないように文頭にセミコロンを付けています。
var hoge = "hoge";console.log(hoge);;(function() {var moge = "moge";console.log(moge);})();


文末にセミコロンはちゃんと付けましょう。ってことですね。