如何保持JavaScript闭包的状态?

时间:2010-06-12 16:59:48

标签: javascript json closures

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

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

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

你从哪里开始执行?如果您是本机应用程序或Web浏览器扩展,您可能有一些希望,通过内部访问它正在使用的任何脚本引擎。但是从网络内容的脚本中,没有希望。

[[Scope]]是一个ECMAScript内部属性,您无法从解释器内部访问或保留,但远不是唯一的一个;几乎所有[[...]]属性都无法访问。函数代码引用,原型,属性,可枚举性,所有者上下文,监听器,与宿主对象(例如DOM节点)有关的所有内容......有无数种失败的方法。

您不能保留或迁移Web应用程序,而不要求它们遵循一些严格的规则来避免除最基本的JS功能之外的所有其他功能。