javascript - 如何保存 JavaScript 闭包的状态?

标签 javascript json closures

我正在开发一个迁移平台,用于将 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/

相关文章:

javascript - 更新合约状态变量后交易失败

javascript - 使用 javascript 附加文章和部分

ios - 如何在 swift 中创建具有特定类型别名的闭包?

memory-leaks - 如何识别、修复、关闭Windows Sidebar小工具中的内存泄漏?

javascript - 面向对象的 JavaScript 工具

javascript - 修改日期时出现问题(修改错误)

Javascript 高级正则表达式计数

java - 如何在android中使用volley获取Json对象中的Json数组并在listview代码和Xml Avilavble中设置此json数据

json - 为什么 Postman 返回未缩小的 JSON 响应?

php - ReflectionFunctionAbstract::getClosureThis() 的目的是什么?