Ошибка возникает, когда «родительское» окно сценария расположено (т.е. закрыто), но вызывается ссылка на сценарий, который все еще удерживается (например, в другом окне). Даже если «объект» все еще жив, контекст, в котором он хочет выполнить, отсутствует.
Это немного грязно, но работает для моего гаджета Windows Sidebar:
Вот общая идея:
«Главное» окно устанавливает функцию, которая будет оценивать некоторый код, да, это так ужасно.
Затем «потомок» может вызвать эту «функцию строителя» (которая / связана с областью главного окна) и вернуть функцию, которая также связана с «главным» окном. Очевидным недостатком является, конечно, то, что функция «отскока» не может быть закрыта по объему, в котором она, казалось бы, определена ... в любом случае, достаточно гибкости:
Это частично псевдокод, но я использую его вариант в гаджете боковой панели 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.