使用JS

时间:2017-01-30 09:02:14

标签: javascript

因此,在我的js代码中,我有一些全局变量可以多次更改其值,例如

var x = 0;
...
x = 10;
...
x = 5;

是否有可能获得历史记录" x没有在其他变量中保存其值?比如,是否有某些功能可以检测到某个时间点x等于10?

4 个答案:

答案 0 :(得分:9)

不,一旦为变量赋值,该变量的先前值就会被覆盖。它不会保留在任何地方。 (如果是的话,那将是内存管理的噩梦。)

如果需要,可以使用setter函数创建一个保留历史记录的对象属性;粗略的例子:



var obj = {
  _fooValue: undefined,
  fooHistory: [],
  set foo(value) {
    this.fooHistory.push(this._fooValue);
    this._fooValue = value;
  },
  get foo() {
    return this._fooValue;
  }
};

obj.foo = 0;
obj.foo = 5;
obj.foo = 42;
console.log(obj.fooHistory);




在该示例中,历史记录不包含当前值,只包含前一个值,并且它将当前值存储在另一个对象属性中,这意味着代码可以绕过setter。你可以做很多调整。如果您认为这很重要,可以将其锁定更多:



var obj = (function() {
  // These two vars are entirely private to the object
  var fooHistory = [];
  var fooValue;
  
  // The object we'll assign to `obj`
  return {
    set foo(value) {
      fooHistory.push(fooValue);
      fooValue = value;
    },
    get foo() {
      return fooValue;
    },
    get fooHistory() {
      // Being really defensive and returning
      // a copy
      return fooHistory.slice(0);
    }
  }
})();

obj.foo = 0;
obj.foo = 5;
obj.foo = 42;
console.log(obj.fooHistory);




答案 1 :(得分:1)

您可以使用变量like array和unshift next value到此数组。要使用它需要第一个元素:

var x = [];
...
x.unshift(10);
...
x.unshift(5);

var currentX = x[0];
var allValues = x;

答案 2 :(得分:0)

是的。在Microsoft Edge浏览器中使用Time Traveling调试。检查this

答案 3 :(得分:0)

我不是JS专家,但作为任何OOP语言的常见想法,我建议为x创建特殊类(在您的示例中继承自Integer),它具有覆盖setter和一些历史数组列表。因此,当您设置一个新值时,它会存储在您的历史记录中。

您只需要更改变量类型,而不是代码。我也不认为在任何语言中都有一些标准的解决方案。可能是一些动态的内省,但那些比我的想法更复杂。