undefined () используется как функция - PullRequest
0 голосов
/ 23 марта 2012

Я читал статью о сеансе отладки javascript, где автору нужен был способ попасть в removeChild of Element, чтобы узнать, какой код удаляет конкретный элемент во время выполнения.

Поэтому он использовал следующий код для цели

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

Насколько я знаю, "undefined - это свойство глобального объекта, то есть это переменная в глобальной области видимости." (цитируется по MDN) typeof, который не определен.

В следующей строке автор говорит, что он получает трассировку стека (обратите внимание, что он работает с оперой и стрекозой).

Я попытался выполнить этот код, и он работает, если он используется, но если я пытаюсь использовать только

undefined()

Это дает мне ошибку «Ошибка типа: undefined не является функцией», которую я понимаю.

Может кто-нибудь объяснить, как упомянутый код работает как действительный javascript и как он решает проблему получения трассировки стека.

Ответы [ 4 ]

6 голосов
/ 23 марта 2012

Когда автор вызывает undefined(), это вызывает ошибку, которую он улавливает в отладчике, чтобы он мог выяснить, кто вызывает removeChild для этого элемента.

Другой подход заключается в использовании оператора debugger;, который устанавливает точку останова, если отладчик открыт.

3 голосов
/ 23 марта 2012

Он специально генерирует исключение.

Быстрый способ найти код, который вызвал бы removeChild (), - просто заставить removeChild () генерировать исключение

Вы также можете сделать что-то вроде:

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

Чтобы запустить отладчик.

3 голосов
/ 23 марта 2012

Это работает специально, потому что undefined не является функцией, что означает, что когда вызывается функция removeChild, она выдает ту же ошибку. Это производит очень полезную трассировку стека.

1 голос
/ 23 марта 2012

Я не уверен, что понимаю вопрос, но насколько я могу судить, он сделал недействительный вызов, чтобы отладчик мог открыться при попытке его выполнить, что позволило ему увидеть откуда removeChild вызывали. Так что его undefined() так же недействителен, как и ваш, в этом его суть.

...