一般的にブックマークレットなんかは変数汚染しないように
無名関数で実行するようになってますが
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 コメント:
コメントを投稿