Greasemonkey script execution environment 2
前回の続き.「初心者向け Javascript 勉強会」の Greasemonkey に関する資料が公開されているブログエントリのコメント欄にて補足的なやりとりが見られる.どうやら Greasemonkey から提供された window オブジェクトはスクリプト間で共有されるらしい.確認してみよう.ようやく Firebug の "console" を覚えたのでソレで.
console.log('script a');
a = 10
window.b = 11;
if (typeof a != 'undefined') console.log(a);
if (typeof b != 'undefined') console.log(b);
if (typeof c != 'undefined') console.log(c);
if (typeof d != 'undefined') console.log(d);
もう一つ.
console.log('script b');
c = 20;
window.d = 21;
if (typeof a != 'undefined') console.log(a);
if (typeof b != 'undefined') console.log(b);
if (typeof c != 'undefined') console.log(c);
if (typeof d != 'undefined') console.log(d);
コンソールには "script 1" → "10" → "11" → "script 2" → "11" → "20" → "21" の順で表示された.window オブジェクトに定義したプロパティが引き継がれていることが分かる.script 2 側で "10" が表示されていないことから,Global オブジェクト != window オブジェクトであることも分かる (スコープチェイン中で a が未定義であることが前提).
で,ひとつ重要な事柄が.どうやら Opera の UserJS というもので Greasemonkey と似たようなことができるらしく,こちらでは機能が設けられた目的の違いから Greasemonkey のような保護が効かないようだ.つまり,スクリプトを Opera 対応させたい場合は匿名関数で wrap した方が良い,ということになる (その他,様々な cross browser hack も必要になるのだろう).恐らく,スピーカの方もこの件を伝えたかったのだと思う.
以上,今朝 Twitter で「グリモンスクリプト中の匿名関数は時代遅れのバッドノウハウ」と,やや刺激的に紹介されてしまったのでビビって補足している次第 (まぁでも間違ってないよな).ぶはは ;D
Comments
スクリプト間での関数共有に関しては,何かいい手がないですかねぇ.読み込まれる順番とか気にしないといけないし,外部サイトから持ってくるのは suspiciously だし.