【问题标题】:Using Self Calling Anonymous Functions and $(document).ready使用自调用匿名函数和 $(document).ready
【发布时间】:2012-03-08 02:13:30
【问题描述】:

我最近刚刚了解了自调用匿名函数。我遇到的一些 sn-ps 代码使用了自调用函数和 $(document).ready。两者都使用似乎是多余的或毫无意义的。

有没有你会使用的案例

(function(){
   $(document).ready();
})();

对比

$(document).ready(function(){
   (function(){})();
});

我认为您要么希望脚本立即执行,要么在 DOM 加载后执行。我不明白你为什么要同时使用两者。

谢谢。

【问题讨论】:

  • 仅供参考 - 它们不等价。

标签: javascript jquery


【解决方案1】:

第一个示例肯定有一个用例。如果您在同一页面上加载了其他 JS 库/脚本,则无法保证它们不会覆盖 $ 变量。 (当您在同一页面上有 Prototype 和 jQuery 时,这很常见)。

因此,如果 Prototype 使用 $,那么您需要在想要使用 jQuery 的任何时候使用 jQuery。这可能会变得非常丑陋:

jQuery(function(){
    jQuery('a', '#content').bind('click', function(){
        if(jQuery(this).attr('href') == 'www.google.com')
        {
            alert("This link goes to Google");
            jQuery(this).addClass('clicked'));
        }
    });
})

请记住,我们不能使用$,因为这是全局范围内的 Prototype 方法。

但是如果你把它包裹在这个里面..

(function($){
    $(function(){

        // your code here

    });
})(jQuery);

$ 实际上会在内部引用 jQuery 库,而在外部仍然引用 Prototype!这可以帮助整理您的代码:

(function($){
    $(function{}(
        jQuery('a', '#content').bind('click', function(){
            if(jQuery(this).attr('href') == 'www.google.com')
            {
                alert("This link goes to Google");
                jQuery(this).addClass('clicked'));
            }
        });
    ));
})(jQuery);

这是 jQuery 扩展的常见模式,以确保它们始终添加到 jQuery 对象中,但可以使用 $ 编写以保持代码整洁。

【讨论】:

  • 你知道 $.noConflict() 函数吗?这消除了对 $ 的依赖。例如 var j = $.noConflict();表示变量 j 现在等于 $ 因此 j("#ElementId");将是有效的。文档:api.jquery.com/jquery.noconflict
【解决方案2】:

您不想同时使用两者,您正在做的事情需要您这样做吗?

在这里的 jquery api 文档http://api.jquery.com/ready/,你可以看到这些例子:

.ready() 方法通常与匿名函数一起使用:

$(document).ready(function() {
// .ready() 的处理程序被调用。

});

相当于调用:

$(函数() {
// .ready() 的处理程序被调用。

});

但我不确定这是否能回答您的问题,因为我看不出您实际在哪里提问。希望这也能有所帮助!

【讨论】:

    【解决方案3】:

    引入另一个闭包的唯一原因是引入另一个作用域边界来加载/保护全局对象,例如 $。

    例如:

    $(document).ready(function(){
    
        // Do upper scope things.
    
        (function(){
    
            // Do lower scope things.
    
        })();
    
    });
    

    基于你说你最近学习了这些东西,我假设你是 JavaScript 的相对新手。

    我整理了一篇博文,可能有助于从 JavaScript 新手的角度解释一些基本概念,包括函数范围。 http://bit.ly/tLkykX

    【讨论】:

    • 感谢莫里斯的链接。好读。如果可以的话,我会标记你和 Colin 的正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多