Greasemonkeyスクリプト全体を無名関数で囲う意味
よくGreasemonkeyスクリプトを見ると全体を無名関数(匿名関数)で囲っているものを見ることがあると思います。
つまり、今は囲まなくても問題はない。(ただしGreasemonkeyに限る)
でも、実際のスクリプトでは囲んでいる場合が多いと思うのでどうしてかというと以下のような理由がある。
ユーザスクリプトを (function() ...)(); で囲むことについて - mallowlabsの備忘録
ただ2010年6月6日現在のソースを見るとデフォルトではまた無名関数で囲んでから実行されている気がするけど、念のため囲っておいた方がいいじゃないかな。
components/greasemonkey.js at master from greasemonkey's greasemonkey - GitHub
現在は囲わなくてもreturnできるけど、未来に変化があるかもしれないので念のためって事。
また、このGreasemonkey側でスクリプトの前後を囲うか否かは@unwrapというメタ情報によって決めることができる。
以下のように@unwrapを入れると、無名関数で囲わずに実行されるようになっている。
function について
(function(){
// 処理内容
})();
何でこのような記述をしているかというと、歴史を掘り返すのは面倒なので簡潔に- 昔はトップレベルに宣言した変数が外部に影響を出してしまっていた?
- 今はevalInSandboxで実行されているので無名関数で囲わなくても問題はない。
つまり、今は囲まなくても問題はない。(ただし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 - 枕を欹てて聴く
- エイリアスを自然に作れる
function について
(function(_doc) {
console.log(_doc); // document
})(document);
new function(_doc) {
console.log(_doc); // document
}(document)
結論的には囲わなくても良いけど、囲った方が無難だと思う。コメント(0件)
- TB-URL http://efcl.info/adiary/046/tb/
-
[greasemonkey]Greasemonkeyスクリプトの開発で役に立ったサイトや本
Alone Like a Rhinoceros HornFirefox にこんな機能があればいいなあ → ん、Greasemonkey というのでできるらしいぞ → ユーザースクリプトとやらを書けばいいのか → どうやって書くんだ? というところからスタートして、最終的に自作のユーザースクリプトを公開するに至...