一般的にブックマークレットなんかは変数汚染しないように
無名関数で実行するようになってますが
Sleipnir ではその辺どうなってるのかチェック。
まず、リンククリックで 変数str の値を表示するhtmlを用意。
(html,bodyタグを書くと投稿できなかったので補完してください。)
その次に 変数str の値を変更するスクリプトを用意。
/* Sleipnirスクリプト(WSH), UserActionスクリプト */ var pnir = new ActiveXObject("Sleipnir.API"); var id = pnir.GetDocumentID(pnir.ActiveIndex); var window = pnir.GetWindowObject(id); var document = pnir.GetDocumentObject(id); str = "fuga"; window.alert("str : " + str);
/* SeaHorseスクリプト (JavaScript) */ // ==UserScript== // @name 変数汚染チェック (JavaScript) // @include *test.htm // @description 変数汚染チェック (JavaScript) // ==/UserScript== var pnir = new ActiveXObject("Sleipnir.API"); var id = pnir.GetDocumentID(pnir.ActiveIndex); var window = pnir.GetWindowObject(id); var document = pnir.GetDocumentObject(id); str = "fuga"; window.alert("str : " + str);
/* SeaHorseスクリプト (SleipnirScript) */ // ==UserScript== // @name 変数汚染チェック (SleipnirScript) // @include *test.htm // @description 変数汚染チェック (SleipnirScript) // @type SleipnirScript // ==/UserScript== var pnir = new ActiveXObject("Sleipnir.API"); var id = pnir.GetDocumentID(pnir.ActiveIndex); var window = pnir.GetWindowObject(id); var document = pnir.GetDocumentObject(id); str = "fuga"; window.alert("str : " + str);実行結果
Sleipnirスクリプト(WSH) str : hoge // 変わらず UserActionスクリプト str : fuga // 変わった SeaHorseスクリプト (JavaScript) str : fuga // 変わった SeaHorseスクリプト (SleipnirScript) str : fuga // 変わった
Sleipnirスクリプト(WSH)以外は 変数str の値が変更されました。
WSH だと Sleipnir とは別スレッドで動くので影響を及ぼさないようです。
Sleipnirスクリプト(WSH)の場合、windowオブジェクト からたどらないと
アクセスできないので変数汚染の心配は少ない。
str = "fuga"; window.alert("str : " + str); ↓ window.str = "fuga"; window.alert("str : " + window.str); // fuga
では、次に var 宣言したらどうなるかの実験。
/* Sleipnirスクリプト(WSH), UserActionスクリプト */ var pnir = new ActiveXObject("Sleipnir.API"); var id = pnir.GetDocumentID(pnir.ActiveIndex); var window = pnir.GetWindowObject(id); var document = pnir.GetDocumentObject(id); var str = "fuga"; window.alert("var str : " + str);
/* SeaHorseスクリプト (JavaScript) */ // ==UserScript== // @name var var 変数汚染チェック (JavaScript) // @include *test.htm // @description var 変数汚染チェック (JavaScript) // ==/UserScript== var pnir = new ActiveXObject("Sleipnir.API"); var id = pnir.GetDocumentID(pnir.ActiveIndex); var window = pnir.GetWindowObject(id); var document = pnir.GetDocumentObject(id); var str = "fuga"; window.alert("var str : " + str);
/* SeaHorseスクリプト (SleipnirScript) */ // ==UserScript== // @name var 変数汚染チェック (SleipnirScript) // @include *test.htm // @description var 変数汚染チェック (SleipnirScript) // @type SleipnirScript // ==/UserScript== var pnir = new ActiveXObject("Sleipnir.API"); var id = pnir.GetDocumentID(pnir.ActiveIndex); var window = pnir.GetWindowObject(id); var document = pnir.GetDocumentObject(id); var str = "fuga"; window.alert("var str : " + str);実行結果
Sleipnirスクリプト(WSH) str : hoge // 変わらず UserActionスクリプト str : hoge // 変わらず SeaHorseスクリプト (JavaScript) str : fuga // 変わった SeaHorseスクリプト (SleipnirScript) str : hoge // 変わらず
SeaHorseスクリプト (JavaScript) だけ 変数str の値が変更されました。
ということはこんな感じなのかな。
// SeaHorseスクリプト (JavaScript) window └ var str = "hoge"; // それ以外 window └ (function(){ var str = "hoge"; })();
結局のところ変数汚染が起こる場合もあるので
スクリプトは無名関数でラップして var 宣言しておくのが無難ですね。
0 コメント:
コメントを投稿