Как сохранить состояние закрытия JavaScript? - PullRequest
5 голосов
/ 12 июня 2010

Я работаю на платформе миграции для переноса веб-приложений с одного устройства на другое.Я расширяю его, чтобы добавить поддержку для сохранения состояния JavaScript.Моя основная задача - создать файл, представляющий текущее состояние исполняемого приложения, передать его на другое устройство и перезагрузить состояние в целевом устройстве.

Основное решение, которое я принял, состоит в том, чтобы перемещаться по объекту окна и сохранять все его свойства-потомки, используя JSON в качестве базового формата для экспорта и расширяя его для реализации некоторых функций:

  • сохранение объектассылка, даже если циклическая (библиотека dojox.json.ref)
  • поддержка таймеров
  • Дата
  • нечисловые свойства массивов
  • ссылка на элементы DOM

Самая важная задача, которую мне нужно решить , - экспорт замыканий.На данный момент я не знал, как реализовать эту функцию.Я прочитал о внутреннем свойстве EcmaScript [[scope]], содержащем цепочку областей действия функции, похожий на список объект, составленный из всего вложенного контекста активации функции.К сожалению, он не доступен через JavaScript.Кто-нибудь знает, есть ли способ прямого доступа к свойству [[scope]]?Или другой способ сохранить состояние замыкания?

Ответы [ 2 ]

2 голосов
/ 12 июня 2010

Откуда ты исполняешь? Если вы являетесь нативным приложением или расширением веб-браузера, у вас может быть некоторая надежда, благодаря внутреннему доступу к любому используемому скриптовому движку. Но от сценария в веб-контенте нет надежды.

[[Scope]] - это одно внутреннее свойство ECMAScript, к которому вы не можете получить доступ или сохранить изнутри интерпретатора, но далеко не единственное; почти все свойства [[...]] недоступны. Ссылки на код функции, прототипы, свойства, перечислимость, контекст владельца, слушатели, все, что связано с хост-объектами (такими как узлы DOM) ... существует бесконечно много способов потерпеть неудачу.

Вы не можете сохранять или переносить веб-приложения, не требуя от них соблюдения некоторых строгих правил, чтобы избежать всех, кроме самых основных функций JS.

2 голосов
/ 12 июня 2010

Это звучит как невозможный подвиг, поскольку вам потребуется доступ к ссылкам, хранящимся в каждой переменной.

Лучшим решением, вероятно, было бы сначала преобразовать ваш код в состояние хранения на доступном объекте - таким образом выможет легко использовать JSON.stringify / parse для его сохранения / восстановления.

Итак, перейдите от

var myFuncWithScope = (function() {
    var variable = 0;
    return function() {
        return variable++;
    }
})(); 

var serializedState = .... // no can do

к

var state = {
    myScope = {
        variable: 0
    }
};

var myFuncWithoutScope = function(){
    return state.myScope.variable++;
}

var serializedState = JSON.stringify(state);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...