Javascript 变量值更改时中断

Javascript 变量值更改时中断,javascript,debugging,watch,breakpoints,Javascript,Debugging,Watch,Breakpoints,类似于这里的其他问题 在任何JavaScript调试器中,有没有办法阻止变量值的更改?(如IE开发工具、Visual Studio或Firebug) 我猜这有点像“监视变量”,但我希望能够看到调用堆栈,并在变量实际发生更改时暂停它 另一种方法可能是使用自定义setter覆盖值设置,并在其中设置断点,但不幸的是,这对IE AFAIK不起作用 更新 看来这种行为至少对于非托管代码是可用的,所以我想也许用C++编写的JavaScript引擎(谷歌的V8)可能有类似的东西,但是它似乎也没有我想要的。 <

类似于这里的其他问题

在任何JavaScript调试器中,有没有办法阻止变量值的更改?(如IE开发工具、Visual Studio或Firebug)

我猜这有点像“监视变量”,但我希望能够看到调用堆栈,并在变量实际发生更改时暂停它

另一种方法可能是使用自定义setter覆盖值设置,并在其中设置断点,但不幸的是,这对IE AFAIK不起作用

更新
看来这种行为至少对于非托管代码是可用的,所以我想也许用C++编写的JavaScript引擎(谷歌的V8)可能有类似的东西,但是它似乎也没有我想要的。

< P>你甚至不需要IDE——你可以使用“Objy.WAT()”:

如果您使用任何一个调试器,我强烈推荐Firebug。对于所有Javascript、HTML和CSS需求:-):

===========================================================

2019年更新:

  • 这是古老的历史。毫无疑问,它在大多数当代浏览器中都不可用

  • 现在我个人最喜欢的JS调试工具是

  • 我个人最喜欢的JSIDE(用于.Net内核等)是(MSVC)

  • 您可以使用Chrome调试器执行任何“预期”的调试操作,包括设置手表(就像您使用FF Firebug一样)

  • Chrome调试器与MSVC IDE集成良好

  • 两者都是“免费”(至少“像啤酒一样免费”);两者在Windows、Mac和Linux上都运行良好


我在Chrome中成功地使用了这个库,它看起来支持所有主要浏览器

只需包含.js文件,然后调用:

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

我不知道我是否误解了你的问题。如果您想在Chrome Developer Tools中的js调试会话中观察表达式并在其达到某个值时停止,那么这相当简单

您只需在要检查的值所在的行上放置一个断点,然后用鼠标右键单击该断点并选择“编辑断点…”。将弹出一个对话框,提示输入表达式,当表达式的值为true时,执行将停止

例如,假设有一个循环,将一个单元添加到其中的一个变量,并希望在变量等于3时停止执行。循环中的表达式如下所示:

n=i++

您必须在该行上设置断点,并且要监视的表达式(在“编辑断点…”提示后)将是
n==3
。运行代码时,当变量达到该值时,它将停止


您会注意到设置了条件,因为断点变为橙色而不是蓝色。

完全中断线程的简单方法是在中放入警报,这很烦人,是的,但您可以根据需要发出警报,包括变量、字符串等等。如果你使用像firebug这样的东西,并且你的代码中有日志,那么你可以很容易地通过警报来逐步完成你的程序。问题是,我不知道变量在哪里被更改了。它可能发生在另一个文件中(或几个文件之一)。我不打算在我的代码中乱扔警报语句,试图找出它在哪里发生了变化。在这一点上,我不妨使用调试器逐行地检查代码。谢谢。我想这会管用的。然而,我不认为它与很多浏览器atm兼容,b/c它是非标准javascript 1.8.6:还没有尝试过,但正如上面的链接所指出的,使用setter/getter方法可能是一种更好的方法:2016在Firefox或Chrome中不受支持。这在兼容ES5的浏览器中工作(在Chrome 51中测试)。是特定于Firefox的。它已在FF 58中删除。使用并放入它们。使用Chrome对我不起作用。我先运行了JavaScript。然后我执行了
watch(myObject'propertyName',function(){console.log('changed!');})。即使属性值正在更改,console.log消息也从未出现。请在调用watch()时检查控制台中是否存在错误。这个库肯定可以工作,所以我猜要么它没有加载,要么你对它的调用没有成功。通常我会使用JSFIDLE,但它们现在已经关闭了,所以这里有一个工作示例。看起来要么是我的语法错误,要么是他们让方法变得更平滑(可能是前者):我也不工作,但我正在尝试观察一个闭包变量。。。不确定这是否支持这一点。没有得到错误,但它从未命中调试器语句。如果在相邻行上有n=i++(因此现在有一个循环,其中i递增两次),并且没有将断点放在相邻行上,它会在相邻行上的n变为3时停止吗?如果不是的话,这就不能满足我的要求。或者,如果n是一个对象的属性,可以在很多地方设置,那么将手表放在一个n设置器上是否足以覆盖所有文件中n的所有设置?还没有尝试过这个精确的示例,但据我所知,我会说是,作为“编辑断点…”中要计算的表达式对话框不需要与断点所在行中的代码相同。它也不需要是“var等于值”;例如,您可以输入类似于
i+j的内容,我相信表达式只有在遇到断点时才会被计算。因此,在两行n=i++的示例中,其中一行上只有一个断点,根据放置断点的行和初始值i,n==3的断点可能不会被击中。很抱歉,我在上一条评论中使用的“hit”有点松散,因为我用它来表示两种不同的意思。当断点被命中时(我的意思是它所在的行被执行,它包含的表达式是evaluat)