2017-01-30 38 views
4

变量的所有值所以在我js代码我有一个改变其值几次一些全局变量,例如获取使用JS

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

是否有可能得到的x“历史”,但不保存其其他变量的价值?喜欢,是否有一些功能可以检测到在某个时间点x等于10?

+0

你有什么相关的谷歌? –

+0

没有使用历史数组变量我没有看到这个工作伙伴 - 当然我可能是错的。 – Terrance00

+0

nope,我试过但没有成功 – Coffee

回答

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);

在这个例子中,历史不包含当前值,仅仅是以前的,它存储在另一个对象属性的当前值,这意味着代码可以绕过二传手。有很多你可以做的调整。如果你认为它是重要的,你可以锁定它更多:

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);

+0

它如何跳过当前(最后一个)值? –

+1

啊,我明白了,你只是推前一个,而不是当前)) –

+0

@vp_arth:是的。 :-) –

0

是的,有。在Microsoft Edge浏览器中使用时间旅行调试。检查this了。

0

我不是JS专家,但作为共同的理念,为任何OOP语言,我建议创建x特殊类(由Integer在你的榜样继承),这已经重写setter和一些历史数组列表。所以,当你设置一个新的值时,它会存储在你的历史记录中。

您只需要更改变量类型,而不是代码,该代码适用于该类型。我也不认为有任何语言的标准解决方案。可能是一些动态的introspectors,但这些会比我的想法更加复杂。

1

您可以使用像数组这样的变量,并将下一个值移到这个数组中。并使用它采取第一个元素:

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

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