我正在javascript调试会话中阅读article,其中作者需要一种方法进入removeChild of Element以了解哪些代码在运行时删除了一个特定元素。
所以他使用以下代码
javascript:void(Element.prototype.removeChild=function(){undefined()})
据我所知,“undefined是全局对象的属性,即它是全局范围内的变量。”(引自MDN) typeof未定义。
在下一行中,作者说他得到了堆栈跟踪(注意他正在使用opera和dragonfly)。
我已尝试执行此代码,如果使用它,它可以工作,但如果我尝试仅使用
undefined()
它确实给我错误“TypeError:undefined不是函数”,我理解。
任何人都可以解释一下这些代码如何作为有效的javascript工作,以及它如何解决获取堆栈跟踪的问题。
答案 0 :(得分:6)
当作者调用undefined()
时,会导致错误发生,他正在调试器中捕获,这样他就可以找出谁在该元素上调用removeChild
。
另一种方法是使用debugger;
语句,如果调试器打开则会强制断点。
答案 1 :(得分:3)
这特别有效,因为undefined
不是函数,这意味着当调用removeChild
函数时,它会抛出相同的错误。这产生了非常有用的堆栈跟踪。
答案 2 :(得分:3)
它故意抛出异常。
找到调用removeChild()的代码的快速方法是 只需让removeChild()抛出异常
您还可以执行以下操作:
javascript:void(Element.prototype.removeChild=function(){debugger;})
启动调试器。
答案 3 :(得分:1)
我不确定我是否理解这个问题,但据我所知,他所做的是进行无效的调用,以便调试器在尝试执行时打开,从而允许他查看调用removeChild
的位置。所以他的undefined()
和你的一样无效,这就是它的重点。