为什么有些人写一个像$(函数($)的函数
我知道像$(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)
你可能想读这个 。