5

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

jQuery(function( $ )编写函数喜欢解决$任何其他库使用的任何潜在冲突是有原因的,但不是$function($).

4

10 回答 10

4

没有理由使用

$(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.
于 2013-02-14T06:42:23.043 回答
3

没用的

这种形式根本没有用:

$(function($) {
});

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

它如何有用

由于 jQuery 将自身作为第一个参数传递给 DOM 就绪事件处理函数,因此您可以通过以下方式充分利用它:

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

这种行为的证明也可以在源代码中找到:

readyList.resolveWith( document, [ jQuery ] );

它映射thisdocument您的 ready 函数的第一个参数和jQuery. 代码看起来有点不明显的原因是因为 ready 事件是使用Deferred.

等效的

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

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

如果您在准备好的处理程序之外做更多的事情,这将是首选,这实际上比您想象的更频繁地发生。

于 2013-02-14T06:41:53.060 回答
2

当 DOM 准备就绪时,您可以通过多种方式为 DOM 初始化 jQuery 脚本。流行的方法是:

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

同样的简写是:

$(function(){});

更新#1:$()对战jQuery()

出于询问jQueryvs.$的原因,原因是大多数库$用作访问库中函数的更短的方式。比如说,MooTools 和 Prototype JS。因此,为避免冲突,它们可能会替换$jQuery.

jQuery 有一个名为的函数jQuery.noConflict();,它放弃了 jQuery 对$变量的控制,使$jQuery 无法工作。希望这可以解决您的问题。

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

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


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

没有人使用:

$(function($){})

它是

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

或者

$(function(){});

请检查。:)

于 2013-02-14T06:37:24.170 回答
1
$(function( $ ) 

是简写

$(document).ready(function() {

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

于 2013-02-14T06:38:46.190 回答
1

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

检查这里

将 jQuery 与其他库一起使用

于 2013-02-14T06:38:58.503 回答
1

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

于 2013-02-14T06:38:29.173 回答
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。

更多在这里阅读

于 2013-02-14T06:39:26.367 回答
0

你的问题不清楚。传递JQuery对象使其成为本地范围(据我所知,对于模块)。它被用作性能增强。

(function($) {
  // Code in here
})(jQuery);
于 2013-02-14T07:02:23.170 回答
0

准备() | 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)

您可能喜欢阅读内容。

于 2013-02-14T06:58:58.293 回答
0
$(function() { 
  // Do your code here...
}); 

确保文档和脚本已完全下载。

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

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

因此,您可以同时使用上述两种方法。

(function($){ 
   $(function() { 
      // Do your code here... 
   }); 
})(jQuery);
于 2013-02-14T06:45:19.743 回答