Javascript 为什么在页面加载后会覆盖全局jQuery对象?

Javascript 为什么在页面加载后会覆盖全局jQuery对象?,javascript,jquery,document-ready,Javascript,Jquery,Document Ready,我正在编写一个包含在自执行函数中的jQuery扩展: (function($) { // global variables for the purposes of this test __$ = $; __$support = $.support; $.support.abc = "123"; // Setup for my extension goes here. })(jQuery); 在我的测试页面上,我有 <script type="

我正在编写一个包含在自执行函数中的jQuery扩展:

(function($) {
    // global variables for the purposes of this test
    __$ = $;
    __$support = $.support;

    $.support.abc = "123";

    // Setup for my extension goes here.

})(jQuery);
在我的测试页面上,我有

<script type="text/javascript" src="jquery-1.5.2.js"></script>
<script type="text/javascript" src="myplugin.js"></script>
<script type="text/javascript">
    $(function() {
        console.log(__$ === $); // false
        console.log(__$support === $.support); // false
        console.log($.support.abc); // undefined
    });
</script>
为什么会发生这种情况?我没有其他脚本或jQuery插件可以覆盖jQuery对象

我无法找到jQuery源代码中的哪些代码在文档准备好后覆盖了jQuery对象。有什么想法吗

如果无法避免这种情况,那么在jQuery.support对象上定义新属性的正确过程是什么?在文档准备就绪后,仍然可以访问这些对象


编辑:我忽略了测试代码中的一个关键部分,它无意中重新评估了jQuery源代码,并解释了为什么会发生这个问题。请看下面我的答案。

有些地方不对劲,因为我得到了答案。

哇,我觉得自己很愚蠢

我的测试代码——我在问题中没有发布的部分——故意在jQuery-1.5.2.js上调用jQuery.ajax,因为这是一个相当大的文件,用于测试进度事件。但是,我忘记了,除非手动将dataType选项设置为script以外的其他选项,否则jQuery将评估jQuery.ajax检索到的任何JavaScript


因此jQuery正在评估自己源代码的新副本,因此window.jQuery被覆盖。

您确定正在执行您的函数吗?@Matt,是的。测试页面的其余部分正常工作,插件中处理AJAX onprogress事件的所有内容都正常工作。但是,当我打开控制台并检查$.support.myproperty时,它是未定义的,这很烦人,因为这意味着我的插件的用户无法利用该检查。如果您查看由JSFIDLE生成的代码,它们实际上会将您的JavaScript代码包装在$window.loadfunction{/**您的代码**/}中,因此这不是一回事。我今晚没有时间,但我明天会尝试建立一个独立的测试页面。@kpozin哦,是的,忘了那个。我换了,看看。输出相同。