Javascript 撤消对构造函数的修改';s错误范围

Javascript 撤消对构造函数的修改';s错误范围,javascript,constructor,scope,Javascript,Constructor,Scope,我创建了一个构造函数,它有一个修改一组局部变量的方法。我的问题是,该方法可能会抛出一些错误,因此当发生错误时,我希望将作用域恢复到它以前的状态。显然,我可以创建一组临时变量,然后将它们分配给构造函数实际使用的变量,但这并不是一个真正的最佳解决方案。我想知道是否有任何方法可以修改该方法中的变量,并将它们恢复到在发生错误时调用该方法之前的状态。除了全局作用域,在JavaScript中没有与作用域交互的真正方法。不过,您可以创建充当作用域的对象 然后我们可以用一些数据创建一个范围 var scope

我创建了一个构造函数,它有一个修改一组局部变量的方法。我的问题是,该方法可能会抛出一些错误,因此当发生错误时,我希望将作用域恢复到它以前的状态。显然,我可以创建一组临时变量,然后将它们分配给构造函数实际使用的变量,但这并不是一个真正的最佳解决方案。我想知道是否有任何方法可以修改该方法中的变量,并将它们恢复到在发生错误时调用该方法之前的状态。

除了全局作用域,在JavaScript中没有与作用域交互的真正方法。不过,您可以创建充当作用域的对象

然后我们可以用一些数据创建一个范围

var scope = new Scope({name: "John"});
现在,我们有一个奇怪的功能,对保罗这个名字的人有着非常好的治疗

function myFunction(data) {
  if (data.name === "John") {
    data.name = "Paul";
    throw new Error("I don't like John!");
  }
}
然后我们可以在try/catch中调用我们的函数

try {
  myFunction(scope.data);
}
catch (e) {
  // scope.data is {name: "Paul"}
  scope.undo();
  // scope.data is {name: "John"}
}

除了全局作用域之外,在JavaScript中没有与作用域交互的真正方法。不过,您可以创建充当作用域的对象

然后我们可以用一些数据创建一个范围

var scope = new Scope({name: "John"});
现在,我们有一个奇怪的功能,对保罗这个名字的人有着非常好的治疗

function myFunction(data) {
  if (data.name === "John") {
    data.name = "Paul";
    throw new Error("I don't like John!");
  }
}
然后我们可以在try/catch中调用我们的函数

try {
  myFunction(scope.data);
}
catch (e) {
  // scope.data is {name: "Paul"}
  scope.undo();
  // scope.data is {name: "John"}
}

使用堆栈

例如


使用堆栈

例如


因此,您希望备份一些变量,但存储原始值“不是最优的”。如果您一开始没有备份,您打算如何恢复?“但这并不是一个真正的最佳解决方案”。你是说它不是最优的,因为你必须展开堆栈?如果是这样,就不要使用JavaScript(或者大多数语言)。如果您是为浏览器编写的,请随意使用许多浏览器端
call/cc
实现语言中不存在的一种。否则,只需使用LISP即可。Memento模式的好例子:)因此您希望备份一些变量,但存储原始值“不是最优的”。如果您一开始没有备份,您打算如何恢复?“但这并不是一个真正的最佳解决方案”。你是说它不是最优的,因为你必须展开堆栈?如果是这样,就不要使用JavaScript(或者大多数语言)。如果您是为浏览器编写的,请随意使用许多浏览器端
call/cc
实现语言中不存在的一种。否则只需使用LISP。Memento模式的好例子:)正如您所知,
10/0
不会抛出错误。它。@fakeRainBrigand-在某些语言中,它会抛出“除零异常”,但JavaScript除外,可能在旧浏览器上。Firefox和Chrome赋予无限。@FakeRainBrigand-是的,你是对的,我已经纠正了这个例子,请检查。看起来不错。只要不传入对象或数组(在大多数情况下可能不会),它就可以工作。正如您所知,
10/0
不会抛出错误。它。@fakeRainBrigand-在某些语言中,它会抛出“除零异常”,但JavaScript除外,可能在旧浏览器上。Firefox和Chrome赋予无限。@FakeRainBrigand-是的,你是对的,我已经纠正了这个例子,请检查。看起来不错。只要不传入对象或数组(在大多数情况下可能不会这样),它就可以工作。