Как сохранить состояние закрытия JavaScript?

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

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

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

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

5
задан Federico Bellucci 12 June 2010 в 16:59
поделиться

2 ответа

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

Лучшим решением, вероятно, было бы сначала рефакторинг вашего кода для сохранения состояния на доступном объекте - таким образом вы могли бы легко использовать 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);
2
ответ дан 15 December 2019 в 00:50
поделиться

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

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

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

2
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: