Javascript 撤消对构造函数的修改';s错误范围
我创建了一个构造函数,它有一个修改一组局部变量的方法。我的问题是,该方法可能会抛出一些错误,因此当发生错误时,我希望将作用域恢复到它以前的状态。显然,我可以创建一组临时变量,然后将它们分配给构造函数实际使用的变量,但这并不是一个真正的最佳解决方案。我想知道是否有任何方法可以修改该方法中的变量,并将它们恢复到在发生错误时调用该方法之前的状态。除了全局作用域,在JavaScript中没有与作用域交互的真正方法。不过,您可以创建充当作用域的对象 然后我们可以用一些数据创建一个范围Javascript 撤消对构造函数的修改';s错误范围,javascript,constructor,scope,Javascript,Constructor,Scope,我创建了一个构造函数,它有一个修改一组局部变量的方法。我的问题是,该方法可能会抛出一些错误,因此当发生错误时,我希望将作用域恢复到它以前的状态。显然,我可以创建一组临时变量,然后将它们分配给构造函数实际使用的变量,但这并不是一个真正的最佳解决方案。我想知道是否有任何方法可以修改该方法中的变量,并将它们恢复到在发生错误时调用该方法之前的状态。除了全局作用域,在JavaScript中没有与作用域交互的真正方法。不过,您可以创建充当作用域的对象 然后我们可以用一些数据创建一个范围 var scope
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-是的,你是对的,我已经纠正了这个例子,请检查。看起来不错。只要不传入对象或数组(在大多数情况下可能不会这样),它就可以工作。