我正在开发一个迁移平台,用于将 Web 应用程序从一台设备迁移到另一台设备。我正在扩展它以添加对保留 JavaScript 状态的支持。 我的主要任务是创建一个文件来表示正在执行的应用程序的当前状态,将其传输到另一个设备并在目标设备中重新加载状态。
我采用的基本解决方案是导航窗口对象并使用 JSON 作为导出的基本格式保存其所有后代属性,并扩展它以实现一些功能:
- 保留对象引用,即使是循环引用(dojox.json.ref 库)
- 支持定时器
- 日期
- 数组的非数字属性
- 对 DOM 元素的引用
我现在需要解决的最重要的任务是闭包的导出。此刻我不知道如何实现这个功能。
我读到了内部 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);
关于javascript - 如何保存 JavaScript 闭包的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3029421/