2007年 12月 07日

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 () {

}