Greasemonkey スクリプトの構成
なんでこんなふうに書いてるの? って感があるのかもしれないから、いちおうかいとくよ!
(function () { // なんか GM ではいらなくなってるっぽいけど、一応かこう
// メインの処理
foobar...
// ユーティリティ関数たち
function $X () {
}
})();って感じで書いてる。メインの処理、その GM で一番重要なところをできるだけ上に書きたい (ただし、うえから順に読んでも理解できるように)。なのでユーティリティ関数とかは関数式ではなく関数宣言で書く。宣言で書いた場合はあとに書いても前のほうで参照できる。
foo();
function foo () {
foobar();
function foobar () {
}
}
// baz(); //=> これはできない
var baz = function () {
};
baz();でも、これだと prototype への代入とかをするのをうしろに書けない。そういうときは、
with (F()) {
var baz = new Foo();
}
function F () {
function Foo () {
return (this instanceof Foo) ? this.init() : new Foo();
}
Foo.prototype = {
init : function () { }
};
var foo = {};
foo.Foo = Foo;
return foo;
}とかやるとうまいこと分離できるぽい。
JSDeferred の jsdeferred.userscript.js は、コピペ用のコード ( http://svn.coderepos.org/share/lang/javascript/jsdeferred/trunk/jsdeferred.userscript.js ) を生成していて、これを最後にコピペして with をつかえば綺麗にかけるようにようにした。
with (D()) {
next();
}
// コピペ
function D () {
}