このエラーは、スクリプトの「親」ウィンドウが破棄された (つまり、閉じられた) 場合に発生しますが、(別のウィンドウなどで) まだ保持されているスクリプトへの参照が呼び出されます。「オブジェクト」はまだ生きていますが、実行したいコンテキストは生きていません。
やや汚れていますが、私の Windows サイドバー ガジェットでは機能します。
一般的な考え方は次のとおりです。「メイン」ウィンドウは、いくつかのコードを評価する関数を設定します。うん、それは醜いです。次に、「子」はこの「ビルダー関数」(/メインウィンドウのスコープにバインドされている/)を呼び出して、「メイン」ウィンドウにもバインドされている関数を取得できます。明らかな欠点は、もちろん、「リバウンド」されている関数が、定義されているように見えるスコープでクロージャーできないことです... とにかく、十分なギバーリング:
これは部分的には疑似コードですが、私は Windows サイドバー ガジェットでその変形を使用しています (サイドバー ガジェットは「制限のないゾーン 0」で実行されるため、シナリオが大幅に変更される場合もあれば、変更されない場合もあります)。
// This has to be setup from the main window, not a child/etc!
mainWindow.functionBuilder = function (func, args) {
// trim the name, if any
var funcStr = ("" + func).replace(/^function\s+[^\s(]+\s*\(/, "function (")
try {
var rebuilt
eval("rebuilt = (" + funcStr + ")")
return rebuilt(args)
} catch (e) {
alert("oops! " + e.message)
}
}
// then in the child, as an example
// as stated above, even though function (args) looks like it's
// a closure in the child scope, IT IS NOT. There you go :)
var x = {blerg: 2}
functionInMainWindowContenxt = mainWindow.functionBuilder(function (args) {
// in here args is in the bound scope -- have at the child objects! :-/
function fn (blah) {
return blah * args.blerg
}
return fn
}, x)
x.blerg = 7
functionInMainWindowContext(6) // -> 42 if I did my math right
バリアントとして、メイン ウィンドウは functionBuilder 関数を子ウィンドウに渡すことができる必要があります。ただし、functionBuilder 関数がメイン ウィンドウのコンテキストで定義されている場合に限ります。
言葉を使いすぎた気がします。YMMV。