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

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

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

没有理由使用

 $(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. 

这毫无用处

这个表格根本没用:

 $(function($) { }); 

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

它如何有用

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

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

也可以在源代码中找到此行为的证据 :

 readyList.resolveWith( document, [ jQuery ] ); 

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

相当于

有点等同的符号是这样的:

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

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

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

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

同样的简写是:

 $(function(){}); 

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

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

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

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

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


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

没有人使用:

 $(function($){}) 

它是

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

要么

 $(function(){}); 

请检查。 🙂

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

 $(function( $ ) 

是简写

 $(document).ready(function() { 

你是对的: Jquery(function( $ )用于与jquery和其他js库可能发生冲突的情况)

是的因为你可能知道原型也使用$所以这里jQuery变得很好,它允许我们使用jQuery,即使$被其他一些lib保存。

检查一下

将jQuery与其他库一起使用

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

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

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

允许在函数中使用$符号而不与其他库冲突,这给了$符号不同的含义。

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

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

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

 (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.

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

从文档中读到:

将jQuery传递给IIFE(立即调用的函数表达式)是一种最佳实践,它将映射到美元符号,因此它不能被执行范围内的另一个库覆盖。

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

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

更多这里阅读

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

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

从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) 

你可能想读这个 。