为什么有些人写一个像$(函数($)的函数

时间:2013-02-14 06:35:28

标签: javascript jquery

我知道像$(function( $ )这样的代码没有任何意义,但我在不同的地方找到了这种代码,包括todomvc

编写像jQuery(function( $ )这样的函数来解决任何其他库使用的$的潜在冲突,而不是$function($)

10 个答案:

答案 0 :(得分:3)

没用了

此表格根本没用:

$(function($) {
});

只有在没有其他库可以覆盖$(例如原型)时,它才会起作用。

如何有用

由于jQuery将自己作为DOM ready事件处理函数的第一个参数传递,因此您可以充分利用它:

jQuery(function($) {
    // this === document
    // $ === jQuery
});

此行为的proof也可以在the source中找到:

readyList.resolveWith( document, [ jQuery ] );

它将this映射到document,将您的就绪函数的第一个参数映射到jQuery。代码看起来有点不明显的原因是因为ready事件是使用Deferred处理的。

等效

有点相同的表示法是这样的:

(function($) {
  $(function() {
  }
}(jQuery));

如果你在就绪处理程序之外做更多的事情,这将是首选,这实际上比你想象的更频繁。

答案 1 :(得分:3)

没有理由使用

$(function($))...

如果您在行的开头使用美元符号,那么它依赖于它是一个jQuery对象,所以如果您稍后将jQuery对象作为参数传递以避免冲突,为什么不在第一个时使用它地点?现在为时已晚......

使用它的正确方法是:

(function($){ // The dollar variable is a parameter.
   $(function(){ // You use the $ variable only inside the function.
   });
})(jQuery); // jQuery is passed as a parameter.

$.somePrototypeFunctionHere(); // Here the dollar variable can be something else.

答案 2 :(得分:2)

有很多方法可以在DOM准备好时为DOM初始化jQuery脚本。流行的方法是:

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

同样的简写是:

$(function(){});

更新#1:$()jQuery()之争!

由于询问jQuery$的原因,原因是大多数库使用$作为访问库中函数的较短方式。说,MooTools和Prototype JS。因此,为避免冲突,他们可能会将$替换为jQuery

jQuery有一个名为jQuery.noConflict();的函数,它放弃了jQuery对$变量的控制,使$不能与jQuery一起使用。希望这能解决你的问题。

在Prototype.JS documentation中,$符号返回文档中具有匹配ID的元素;否则返回传递的元素。

此外,$功能是Prototype的基石。它不仅为document.getElementById提供了一个方便的别名,它还允许您将无差别的ID(字符串)或DOM节点引用传递给您的函数。


更新#2:关于$作为参数的问题......

没有人使用:

$(function($){})

要么是

(function($){})(jQuery);

$(function(){});

请检查。 :)

答案 3 :(得分:1)

$(function(){})的大多数人都是因为他们是用户而这样做。即他们选择使用jquery而不是任何冲突的库。因此使用它是安全的。

答案 4 :(得分:1)

$(function( $ ) 

的简写
$(document).ready(function() {

你是对的:Jquery(function( $ )用于与jquery和其他js库发生冲突的事件

答案 5 :(得分:1)

是的,因为您可能知道原型也使用$所以这里jQuery变得很好,这使我们可以使用jQuery,即使$被其他lib保留。

check Here

Using jQuery with Other Libraries

答案 6 :(得分:0)

这是解决$的潜在冲突的更好方法:

(function($){
   $(function(){
      // all the code stuff here....
   });
})(jQuery);

您的编辑:
My question is actually misunderstood by many giving answers. I want to know about the dollar as an argument in the function.

这只是为了保护$符号,这是jQuery的简写,还有许多其他库也使用$符号,所以经常有机会遇到麻烦有这个。

从文档中阅读:

  

最佳做法是将jQuery传递给IIFE(立即调用的函数表达式),将其映射到美元符号,以便在执行范围内不会被其他库覆盖。

(function($) {
     // all other things    
})(jQuery);
  

现在在封闭中,我们可以使用美元符号代替jQuery。

更多here to read

答案 7 :(得分:0)

$(function() { 
  // Do your code here...
}); 

确保完整下载文档和脚本。

(function($){ 
  // Do your code here...
})(jQuery); 

允许在函数中使用$符号而不会与其他库发生冲突,这些库赋予$ symbol不同的含义。

所以你可以同时使用上述两个。

(function($){ 
   $(function() { 
      // Do your code here... 
   }); 
})(jQuery);

答案 8 :(得分:0)

来自ready() | jQuery

别名jQuery命名空间

使用其他JavaScript库时,我们可能希望调用$.noConflict()以避免名称空间困难。调用此函数时,$快捷方式不再可用,强制我们每次正常编写jQuery时都会写$。但是,传递给.ready()方法的处理程序可以接受一个参数,该参数传递给全局jQuery对象。这意味着我们可以在.ready()处理程序的上下文中重命名对象,而不会影响其他代码:

jQuery(document).ready(function($) {
  // Code using $ as usual goes here.
});

这是指定DOM完全加载时要执行的函数的其他方法。它可以在jQuery中以三种方式完成 -

以下所有三种语法都是等效的:

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

jQuery().ready(function($){}) //(this is not recommended)

jQuery(function($){})

解决冲突的另一种方法是 -

(function($) { /* some code that uses $ */ })(jQuery)

您可能希望阅读this

答案 9 :(得分:0)

你的问题不明确。传递JQuery对象使其本地作用域(据我所知,对模块)。它被用作性能增强。

(function($) {
  // Code in here
})(jQuery);