如何保持JavaScript闭包的状态?

Fed*_*cci 5 javascript json closures

我正在开发一个迁移平台,用于将Web应用程序从设备迁移到另一个设备.我正在扩展它以添加对保留JavaScript状态的支持.我的主要任务是创建一个表示正在执行的应用程序的当前状态的文件,将其传输到另一个设备并重新加载目标设备中的状态.

我采用的基本解决方案是导航窗口对象并使用JSON作为基本格式保存其所有后代属性以进行导出并扩展它以实现一些功能:

  • 保留对象引用,即使是循环(dojox.json.ref库)
  • 支持计时器
  • 日期
  • 数组的非数字属性
  • 对DOM元素的引用

我现在需要解决最重要的任务是出口封闭.此刻我不知道如何实现这个功能.我读到了[[scope]]包含函数作用域链的内部EcmaScript属性,这是一个类似于列表的对象,由函数的所有嵌套激活上下文组成.很遗憾,JavaScript无法访问它.有人知道是否有办法直接进入该[[scope]]物业?或者另一种保持闭包状态的方法?

Sea*_*sey 2

这听起来像是一个不可能的壮举,因为您需要访问存储在每个变量中的引用。

最好的解决方案可能是首先将代码重构为将状态存储在可用对象上 - 这样您就可以轻松地使用 JSON.stringify/parse 来保存/恢复它。

所以从

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

var serializedState = .... // no can do
Run Code Online (Sandbox Code Playgroud)

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

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

var serializedState = JSON.stringify(state);
Run Code Online (Sandbox Code Playgroud)