0

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

4

2 回答 2

3

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

演示

function Scope(data){
  this.data = data;
  this.stages = [];
  this.save(data);
}

Scope.prototype.save = function(){
  var oldData = JSON.parse(JSON.stringify(this.data));
  this.stages.push(oldData);
}

Scope.prototype.undo = function(){
  var lastData = this.stages.pop();
  this.data = lastData;
}

然后我们可以创建一个包含一些数据的范围。

var scope = new Scope({name: "John"});

现在,我们有一个奇怪的函数,对名叫 Paul 的人给予高度优先的待遇。

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"}
}
于 2013-08-14T03:39:50.760 回答
2

使用堆栈

例如。

var Stack = new Array();

doModification(10,'');

function doModification(A,B){
   Stack.push(A);
   Stack.push(B);

   // after modifying,
   try{
     A= 10; 
     if(B == 0) throw new Error("Divide by Zero Exception.");
     B= A/B;
   }
   catch(e){
     // if exception then restore original vars
     B = Stack.pop();
     A = Stack.pop();
     alert(e.description);
   }

   // else if error doesn't come then, clear the stack
   Stack = [];

}
于 2013-08-14T03:40:36.187 回答