【问题标题】:What is the purpose of this? (function ($) { //function code here })(jQuery);这样做的目的是什么? (function ($) { //这里的函数代码 })(jQuery);
【发布时间】:2012-01-08 11:16:17
【问题描述】:

我正在调试别人的 JavaScript 代码,大部分代码是这样包装的:

(function ($) {
    //majority of code here...
})(jQuery);

($)(jQuery) 是怎么回事?我没有被教过这样的编码,也没有见过他们。他们的目的是什么?

同样,没有document.ready,但我认为这是因为代码在最后被(); 读取后立即执行?

【问题讨论】:

  • 该代码将在 document.ready 上执行
  • @longbkit:不,这不是 DOM 就绪代码。
  • @longbkit ,不,这不是它的意思。请去阅读关于闭包的内容..或者,地狱,开始学习javascript。
  • @Raynos 为什么你不明白“这可能是一个菜鸟问题”

标签: javascript jquery function


【解决方案1】:

只是为了扩展RightSaidFred's 回答一点,当我第一次看到()() 语法时,我有点困惑,但是一旦我意识到括号被用来定义一个匿名函数然后调用它,它就有意义了.例如:

(function (msg){alert(msg)})('hello');

... 定义一个函数,然后调用它,传递 'hello' 作为参数。

所以问题中的例子:

(function ($) {
    //majority of code here...
})(jQuery);

将 jQuery 传递给一个匿名函数,并在函数中将其称为 $,这是一种保证 $ 将适用于 jQuery 而不会干扰其他任何东西的方式。

【讨论】:

  • 出于某种原因,这个解释对我来说有点好:)谢谢!
【解决方案2】:

这种结构称为JQuery Plugin,插件的目的是为您的项目中的任何常见任务/功能创建一个框架,同样您可以根据您在不同页面或同一页面中的使用情况扩展您的插件。这样您就可以避免在任何地方重复相同的代码。

看看http://docs.jquery.com/Plugins/Authoring

【讨论】:

  • 该结构不仅仅是一个 jQuery 结构。虽然它可以在创建插件时使用,但不是必须的。 jQuery插件是通过扩展jQuery.prototype创建的。
【解决方案3】:

当您想要/需要使用jQuery.noConflict() 并且全局名称$ 不是jQuery 的别名时,这很有用。您发布的代码允许您仅在匿名函数内使用较短的 $ 来表示 jQuery,而无需将 $ 设为全局。

【讨论】:

  • 谢谢,尽管 RightSaidFred 打败了你。非常感谢。
  • +1 用于提及 jQuery.noConflict,这使得 jQuery 放弃了全局 $
【解决方案4】:
var $ = "some value we don't care about";

 // v=====normal plain old function
(function ($) {
 //        ^=======receives jQuery object as the $ parameter

    //majority of code here, where $ === jQuery...

    $('.myclass').do().crazy().things();


})(jQuery);
 //  ^=======immediately invoked, and passed the jQuery object


 // out here, $ is undisturbed
alert( $ ); // "some value we don't care about"

【讨论】:

  • 好的,所以基本上这样做的目的是让您可以在该函数内部使用 $() 表示法调用 jQuery,如果原型之类的其他东西使用 $() 表示法,则可以在该函数之外调用它没关系?.. 所以实际上它只是让您不必在每次使用无冲突时都编写 jQuery() (或其他符号).. 有意义
  • 基本上,majority of code here ... 位中的所有内容都与其余代码隔离。它存在于单独的范围内。如果您在那里创建 var something = 1 ,它不会在全局 window 范围内结束。此结构之外的代码无法覆盖内部的任何内容。
  • @tsdexter:是的,你明白了。全局jQuery 被本地$ 引用,这意味着全局$(如果有)可以用于其他用途。在 JavaScript 中,变量作用域是用函数创建的。
  • 为了记录,这些被称为 IIFE - 立即调用的函数表达式。 :)
  • @davidchambers:是的,这是一个比仍然流行的“自我调用函数”更好的描述,它不能正确描述正在发生的事情。
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 2016-09-26
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多