使用JS获取变量的所有值

Cof*_*fee 4 javascript

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

var x = 0;
...
x = 10;
...
x = 5;
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 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);
Run Code Online (Sandbox Code Playgroud)

在该示例中,历史记录不包含当前值,仅包含前一个值,并且它将当前值存储在另一个对象属性中,这意味着代码可以绕过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);
Run Code Online (Sandbox Code Playgroud)