我有一个我创建的构造函数,它有一个修改一堆局部变量的方法。我的问题是该方法可能会抛出一些错误,所以当发生错误时我想将范围恢复到之前的状态。显然,我可以创建一堆临时变量,然后将它们分配给构造函数实际使用的变量,但这不是一个真正的最佳解决方案。我想知道是否有任何方法可以修改方法中的变量,并将它们恢复到错误情况下调用方法之前的状态。
答案 0 :(得分: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"});
现在,我们有一个奇怪的功能,对保罗的人进行高度优先治疗。
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 = [];
}