私が作成したコンストラクターには、一連のローカル変数を変更するメソッドがあります。私の問題は、メソッドがエラーをスローする可能性があるため、エラーが発生したときにスコープを以前の状態に復元したいということです。明らかに、一時変数の束を作成し、それらをコンストラクターが実際に使用する変数に割り当てることができますが、それは実際には最適なソリューションではありません。エラーが発生した場合に、メソッドから変数を変更し、メソッドが呼び出される前の状態に戻す方法があるかどうかを知りたいです。
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"});
現在、ポールという名前の人を非常に優遇する奇妙な機能があります。
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 に答える