Greasemonkeyスクリプト全体を無名関数で囲う意味
2010/06/06(日) 22:43 Greasemonkey親記事へこのエントリーをはてなブックマークに追加

よくGreasemonkeyスクリプトを見ると全体を無名関数(匿名関数)で囲っているものを見ることがあると思います。
(function(){
    // 処理内容
})();
何でこのような記述をしているかというと、歴史を掘り返すのは面倒なので簡潔に
  1. 昔はトップレベルに宣言した変数が外部に影響を出してしまっていた?
  2. 今はevalInSandboxで実行されているので無名関数で囲わなくても問題はない。
(この無名関数自体がどういう動作をするかはfunction についてを読むといい)
つまり、今は囲まなくても問題はない。(ただしGreasemonkeyに限る)

でも、実際のスクリプトでは囲んでいる場合が多いと思うのでどうしてかというと以下のような理由がある。
  • 習慣的に囲う
  • .user.jsというユーザースクリプトはGreasemonkey以外でも動かす可能性があるので、他のブラウザを考慮して(Operaとか)
他のブラウザだと、グローバル汚染になってしまうことがあるので無名関数で囲っておくと少し優しいよ。
ユーザスクリプトを (function() ...)(); で囲むことについて - mallowlabsの備忘録
  • いきなりreturnできる
無名関数で囲っておけば、以下のようなコードも問題ない。
(function(){
    return;
})();
Greasemonkeyとして実行されるScriptには前に"(function()\n"が、後ろに"\n)()"が付加されて実行されるという動作になっているので、本来は上のように自主的に囲うことなくてもreturnはできるが、Greasemonkeyは(function()\nと\n)()を付加しなくなる(という夢を見た) - FFFF - 0xのようにいきなりその仕様が無くなることがあり得るので、returnしたい人は自主的に囲っておく方がよい。
ただ2010年6月6日現在のソースを見るとデフォルトではまた無名関数で囲んでから実行されている気がするけど、念のため囲っておいた方がいいじゃないかな。
components/greasemonkey.js at master from greasemonkey's greasemonkey - GitHub
現在は囲わなくてもreturnできるけど、未来に変化があるかもしれないので念のためって事。
また、このGreasemonkey側でスクリプトの前後を囲うか否かは@unwrapというメタ情報によって決めることができる。
以下のように@unwrapを入れると、無名関数で囲わずに実行されるようになっている。
// ==UserScript==
// @name Filename
// @namespace http://efcl.info/
// @description 説明文
// @author azu
// @homepage http://efcl.info/
// @unwrap
// ==/UserScript==
@unwrapありなしの動作は以下も参考にGM_listValues, GM_deleteValue, @unwrap - 枕を欹てて聴く
  • エイリアスを自然に作れる
amachang の 「一行で IE の JavaScript を高速化する方法」を掘り下げてみた - latest logでも出てくる話だけど、ただ無名関数で囲んで実行するだけだと寂しいから、エイリアスなどを作るといいかもね。
function について
(function(_doc) {
    console.log(_doc);    // document
})(document);
new function(_doc) {
    console.log(_doc);    // document
}(document)
結論的には囲わなくても良いけど、囲った方が無難だと思う。

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/046/tb/
  • [greasemonkey]Greasemonkeyスクリプトの開発で役に立ったサイトや本 Alone Like a Rhinoceros Horn
    Firefox にこんな機能があればいいなあ → ん、Greasemonkey というのでできるらしいぞ → ユーザースクリプトとやらを書けばいいのか → どうやって書くんだ? というところからスタートして、最終的に自作のユーザースクリプトを公開するに至...