因此,在我的js
代码中,我有一些全局变量可以多次更改其值,例如
var x = 0;
...
x = 10;
...
x = 5;
是否有可能获得历史记录" x
没有在其他变量中保存其值?比如,是否有某些功能可以检测到某个时间点x
等于10?
答案 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和一些历史数组列表。因此,当您设置一个新值时,它会存储在您的历史记录中。
您只需要更改变量类型,而不是代码。我也不认为在任何语言中都有一些标准的解决方案。可能是一些动态的内省,但那些比我的想法更复杂。