2012-03-23 69 views
0

我正在阅读关于javascript调试会话的article,其中作者需要一种方法来获取元素的removeChild以了解,哪些代码在运行时删除特定元素。undefined()用作函数

于是,他用下面的代码为目的

javascript:void(Element.prototype.removeChild=function(){undefined()}) 

据我所知,“不确定的是全局对象的属性,即它是在全球范围内的变量。” (引自MDN) typeof其中未定义。

在接下来的一行中,作者说他得到堆栈跟踪(注意他正在和歌剧和蜻蜓一起工作)。

我曾尝试执行这段代码,和它的作品,如果它是使用,但如果我尽量只使用

undefined() 

它确实给我的错误“类型错误:未定义是不是一个函数”,这我明白。

任何人都可以请解释如何提到的代码工作为有效的JavaScript,以及它如何解决获取堆栈跟踪的问题。

回答

6

当笔者呼吁undefined(),它会导致出现错误,这是他正在迎头赶上在调试器,这样他可以找出谁在呼叫该元素的removeChild

另一种方法是使用debugger;语句,如果调试器处于打开状态,则强制断点。

+0

是的,那样会更有意义,并且可以使它容易理解.... – Vishwanath 2012-03-23 11:23:34

3

这个工作具体是因为undefined不是一个函数,这意味着当调用removeChild函数时,它会抛出相同的错误。这产生了如此有用的堆栈跟踪。

1

我不知道我理解的问题,但据我可以告诉他的所作所为是做出无效调用,这样试图执行它时,调试器会打开,从而让他看到removeChild是被叫来。所以他的undefined()与你的一样无效,就是这一点。

3

它故意抛出异常。

A fast way to find the code that would call removeChild() would be to simply make removeChild() throw an exception

你也可以这样做:

javascript:void(Element.prototype.removeChild=function(){debugger;}) 

启动调试器。