在出错时撤消对构造函数范围的修改

时间:2013-08-14 03:17:55

标签: javascript constructor scope

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

2 个答案:

答案 0 :(得分:3)

除了全局范围之外,没有真正的方法可以与JavaScript中的范围进行交互。但是,您可以创建充当范围的对象。

demo

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"});

现在,我们有一个奇怪的功能,对保罗的人进行高度优先治疗。

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"}
}

答案 1 :(得分: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 = [];

}