Я работаю над платформой миграции для миграции веб-приложений от устройства до другого. Я расширяю его для добавления поддержки сохранения состояния JavaScript. Моя основная задача состоит в том, чтобы создать файл, представляющий текущее состояние выполняющегося приложения, чтобы передать его к другому устройству и перезагрузить состояние в устройстве назначения.
Основное решение, которое я принял, состоит в том, чтобы переместиться по объекту окна и сохранить все его порожденные свойства с помощью JSON в качестве основного формата для экспортирования и расширив его для реализования некоторых опций:
Самой важной задачей, которую я должен решить теперь, является экспортирование закрытий. В данный момент я не знал, как реализовать эту опцию. Я читал о внутреннем свойстве EcmaScript [[scope]]
содержа цепочку объема функции, подобный списку объект, составленный всем вложенным контекстом активации функции. К сожалению, это не доступно JavaScript. Любой знает, существует ли способ непосредственно получить доступ [[scope]]
свойство? Или другой способ сохранить состояние закрытия?
Звучит как невозможный подвиг, поскольку вам потребуется доступ к ссылкам, хранящимся в каждой переменной.
Лучшим решением, вероятно, было бы сначала рефакторинг вашего кода для сохранения состояния на доступном объекте - таким образом вы могли бы легко использовать 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);
Откуда вы выполняете? Если вы являетесь нативным приложением или расширением веб-браузера, у вас может быть некоторая надежда, через внутренний доступ к любому скриптовому движку, который он использует. Но на сценарий в веб-контенте надежды нет.
[[Scope]]
- одно из внутренних свойств ECMAScript, к которому нельзя получить доступ или сохранить изнутри интерпретатора, но далеко не единственное; почти все свойства [[...]]
недоступны. Ссылки на функциональный код, прототипы, свойства, перечислимость, контекст владельца, слушатели, все, что связано с объектами хоста (например, узлы DOM)... существует бесконечно много способов потерпеть неудачу.
Вы не сможете сохранить или перенести веб-приложения, не потребовав от них следовать некоторым строгим правилам, чтобы избежать всех, кроме самых основных возможностей JS.