Как мне найти, где переменная определяется во время выполнения? - PullRequest
11 голосов
/ 12 февраля 2011

Я использую jQuery и YUI бок о бок без проблем до недавнего времени.Иногда внутри функции обратного вызова, скажем, для кнопки YUI, $ будет скрываться какой-либо другой функцией (щелкните для просмотра большой версии): console

и для жизни Я не могу понять, почему это происходит .Да, я знаю, что могу быть в безопасности и использовать jQuery или window.$ везде вместо просто $, но это всего лишь обходной путь, а не реальное исправление.

Во время выполнения, как я могу найти, гдеэтот $ самозванец приходит?- например, найти, где он объявлен, и почему он находится в моей области.


Оказывается, это поведение легко воспроизводится (по крайней мере, в Chrome и Firefox 4) прямо здесь, на переполнении стека,ТАК использует jQuery (опять же, нажмите для увеличения):

more console still more console

Я могу только заключить, что $как

function () {
    return document.getElementById.apply(document, arguments)
}

должно быть с самой консоли!

Найден.

with снова наносит удар.

enter image description here enter image description here

Ошибка хрома для этого: http://code.google.com/p/chromium/issues/detail?id=70969

Ответы [ 4 ]

2 голосов
/ 12 февраля 2011

Вот что попробовать.Отладчик Firebug показывает все переменные, которые доступны в области видимости, в вашем примере это, очевидно, не локальная область, и это также не глобально, так как вы уже протестировали окно.Следовательно, он должен (?) Быть переменной закрытия (которая должна находиться в том же файле).

Прикрепленный снимок экрана показывает доступные области закрытия Firebug debugger

В примере показаноэти данные доступны в $ .each как переменная замыкания.Опять же, согласно моей теории, вы должны быть в состоянии найти виновника, ища экземпляры $ на странице, так как замыкания определены лексически.Может быть, есть функция, вызывающая себя, которая передает $ как плагины jquery.

2 голосов
/ 12 февраля 2011

Бьюсь об заклад, этого не происходит в IE? Это единственная подсказка, которую я смог найти:

http://davidwalsh.name/dollar-functions

http://dam5s.tumblr.com/post/3079779011/bug-in-chromes-javascript-console

Какая-то ошибка в Chrome / Firefox / Safari.

0 голосов
/ 12 февраля 2011

вы можете попробовать использовать jquery.noConflict http://api.jquery.com/jQuery.noConflict

0 голосов
/ 12 февраля 2011

Используйте выражение для часов ...

  • Установите функцию, которая проверяет, правильно ли $, возможно, jQueryCheck (), и предупреждает, если не правильно.

    function jQueryCheck () { если (! $. фильтр) предупреждение ( 'WTF'); }

  • Добавьте точку останова на каком-то шаге, прежде чем ожидать возникновения проблемы в коде.

  • Добавить выражение наблюдения, которое запускает jQueryCheck ().

  • Нажмите точку останова и продолжайте нажимать на следующий шаг. Когда переменная станет недействительной, появится предупреждение, и вы окажетесь на линии после того, как произошло изменение.

Вот код, который я использовал для проверки

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
<script>
function invalid(){
    /* set breakpoint on loop below
        click invalid button
        add watch expression jQueryCheck()
        click nextstep repeatedly until wtf alert
    */
    for(var i=0; i<100; i++){
        if(i == 10)
            $ = 10;
    }
}
function valid(){
    $ = jQuery;
}
function jQueryCheck(){
    if(!$.filter)
        alert('wtf');
}
</script>

<input type="button" onclick="valid()" value="run valid">
<input type="button" onclick="invalid()" value="run invaid">
...