如何在运行时找到变量的定义?

时间:2011-02-12 00:35:21

标签: javascript shadowing

直到最近,我一直在使用jQuery和YUI并没有问题。有时,在YUI按钮的回调中,$将被其他一些功能遮蔽(点击查看大版本): console

对于我的生活,我无法弄清楚为什么会发生这种情况。是的,我知道我可以安全使用jQuerywindow.$到处而不只是$,但这只是一种解决方法,而不是实际修复。

在运行时,我如何找到这个$冒名顶替者的来源? - 例如找到它声明的位置,以及为什么它在我的流血范围内。


事实证明,这种行为很容易在Stack Overflow上重现(至少在Chrome和Firefox 4中),因为SO使用jQuery(再次点击查看完整尺寸):

more console still more console

我只能将$推断为

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

必须来自控制台本身!

找到它。

with再次罢工。

enter image description here enter image description here

Chromium bug:http://code.google.com/p/chromium/issues/detail?id=70969

4 个答案:

答案 0 :(得分:2)

我打赌在IE中不会发生这种情况?这是我能找到的唯一提示:

http://davidwalsh.name/dollar-functions

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

Chrome / Firefox / Safari中的某种错误。

答案 1 :(得分:2)

这是尝试的东西。 Firebug的调试器显示了范围内可用的所有变量,在您的示例中,它显然不是本地范围,并且由于您已经测试了窗口,因此它也不是全局的。$。因此,(?)是一个闭包变量(应该在同一个文件中)。

附带的屏幕截图显示了可用的闭包范围Firebug debugger

该示例显示$ .each中的数据可用作闭包变量。同样,根据我的理论,你应该能够通过在页面上查找$的实例来找到罪魁祸首,因为闭包是通过词法定义的。也许有一个自我调用函数传入$ jquery插件。

答案 2 :(得分:0)

使用监视表达式......

  • 设置一个检查$是否正确的函数,可能是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">

答案 3 :(得分:0)

您可以尝试使用jquery.noConflict http://api.jquery.com/jQuery.noConflict