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

标签 javascript constructor scope

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

最佳答案

除了全局作用域之外,没有真正的方法可以与 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"});

现在,我们有一个奇怪的功能,对名叫 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"}
}

关于javascript - 出错时撤消对构造函数范围的修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18222670/

相关文章:

c++ - 在静态函数中返回一个对象而不是构建它有什么好处?

c++ - 如何在 C++ 中设置空对象 vector ?

C 函数内的 block ?

javascript - 如何在 sequelize 中包含相关行的数量

javascript - 如何下载播放音频

javascript - 在Javascript中,为什么要将引用类型的实例变量放在构造函数中?

ruby - 更改 ruby​​ 变量/引用的值

Javascript OOP 原型(prototype)函数返回未定义

javascript - 如何在angularjs中正确选择数组

javascript - 从构造函数将对象添加到数组