2017-01-30 32 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;