2011-10-27 114 views
35

與其他問題類似,like this onejavascript調試:有沒有辦法打破變量值的變化?

有沒有辦法在任何JavaScript調試器中改變變量值? (如IE開發工具,Visual Studio或Firebug?)

我想它就像是一個「監視變量」,但我希望能夠看到調用堆棧並在變量實際發生變化時暫停它。

另一種方法可能是使用自定義setter重寫值設置,並在其中放置一個斷點,但不幸的是,這對IE afaik不起作用。

UPDATE 看來,這種行爲可至少對於非託管代碼written in C++所以我想,也許用C++編寫(谷歌的V8)一個JavaScript引擎可能有類似的東西,但不會出現有我也想要什麼。

+0

完全破壞線程的簡單方法是提醒一下,它令人討厭的是,但是你可以提醒你想要什麼,你的變量,一個字符串,不管是真的。如果您使用類似螢火蟲的東西,並且您已經登錄了您的代碼,那麼您可以通過警報很容易地瀏覽您的程序。 – Ryan

+4

事情是,我不知道變量在哪裏改變。它可能發生在另一個文件中(或幾個中的一個)。我不會用警報語句來拋棄我的代碼,試圖找出它的變化。在那一點上,我不妨逐行地使用調試器逐行執行代碼。不過謝謝。 – user420667

回答

16

你甚至都不需要一個IDE - 您可以使用 「Object.watch()」:

Object.Watch Tutorial

如果你使用任何一個調試器,我強烈推薦螢火蟲。對於所有你的Javascript,HTML和CSS需要:-):

http://getfirebug.com/javascript

+4

+1 b/c我想這會工作。但是,我不認爲它與很多瀏覽器atm兼容,b/c是非標準的javascript 1.8.6:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/watch – user420667

+0

Haven'但能夠嘗試它,但正如上面的鏈接指定使用setter/getter方法可能是一個更好的方法:https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters – GuruM

+8

我們是在2013年,我仍然在等待瀏覽器支持Object.watch()... –

9

我有這個圖書館在Chrome的成功和它看起來支持所有主要的瀏覽器。

https://gist.github.com/eligrey/384583

就包括.js文件,然後調用:

yourObject.watch('someProperty', function() { 
    doWhatYouWant(); 
    debugger; 
    console.write('this too'); 
    alert('Object Changed'); //etc 
}); 
+0

這看起來不錯。也http://stackoverflow.com/a/1848414/420667。謝謝。 – user420667

+0

對我而言,使用Chrome並不適用。我首先運行了Gist JavaScript。然後我執行'watch(myObject,'propertyName',function(){console.log('changed!');});'。即使屬性值正在改變,console.log消息也沒有出現。 – Joncom

+0

當您調用watch()時檢查控制檯中的錯誤。圖書館肯定工作,所以我猜想,要麼是不加載,要麼是你的調用沒有成功。 – rainabba

-2

我不知道如果我誤解你的問題。如果您想觀看錶達式並在Chrome開發人員工具的js調試會話中達到某個特定值時停止表達,則這種表達方式非常簡單。

您可以簡單地在要檢查的值的行上放一個斷點,然後用鼠標右鍵單擊它並選擇「編輯斷點...」。會彈出一個對話框提示表達式,當其值爲真時,執行將停止。

舉例來說,假設你有一個循環,並要添加一個單元裏面一個變量,要停止執行時,變量等於3.在循環中的表達應該是這樣的:

n = i++;

您必須在該行上設置斷點,並且要監視的表達式(在「編輯斷點...」提示之後)將爲n == 3。運行代碼時,當變量達到該值時,它將停在那裏。

您會注意到您的條件已設置,因爲您的斷點變爲橙色而不是藍色。

+1

如果在相鄰的行上有n = i ++(所以現在你有一個循環,其中i增加了兩倍),並且你沒有在相鄰行上放置斷點,當n在相鄰行上變成3時它會停止嗎?如果沒有,那麼這不會做我想要的。或者,如果n是一個對象的屬性,並且它可以在很多地方設置,那麼將手錶放在n的一個setter上足以覆蓋所有文件中n的所有設置? – user420667

+0

還沒有嘗試過這個精確的例子,但據我所知,我會說是的,因爲在「編輯斷點...」對話框中評估的表達式不需要與斷點所在行中的代碼相同放在。它也不需要是「var等於值」;例如,你可以輸入'i + j <= k * n'。你甚至可以評論表達來禁用它。它與將'if(n == 3){dummy = true}'放在代碼中並將斷點放在'dummy'行中,但將其保持在斷點對話框的「limbo」中相同。親自嘗試確認;) – Pere

+0

我相信只有當斷點被命中時纔會評估表達式。因此,在兩行n = i ++的例子中,只有其中的一個斷點,n == 3的斷點可能不會被命中,具體取決於將斷點放在哪一行以及i的初始值。 – user420667

相關問題