Javascript 理解基本jQuery结构

Javascript 理解基本jQuery结构,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我正在学习jQuery,并试图理解以下代码结构 if(jQuery) (function($){ $.extend($.fn, { MyPlugin: function(a, b) { .... } }); })(jQuery); 据我所知,这首先检查jQuery对象是否存在。如果是,则定义一个内联函数,该函数使用“fn”属性扩展jQuery对象 我在其他几个地方也看到过这个问题,但我不理解的地方还没有得到解决。我

我正在学习jQuery,并试图理解以下代码结构

if(jQuery) (function($){
    $.extend($.fn, {
        MyPlugin: function(a, b) {
        ....        
        }
    });
})(jQuery);
据我所知,这首先检查jQuery对象是否存在。如果是,则定义一个内联函数,该函数使用“fn”属性扩展jQuery对象

我在其他几个地方也看到过这个问题,但我不理解的地方还没有得到解决。我感到困惑的地方

-为什么将特殊的jquery“$”对象传递给初始函数

-为什么内联函数传递jQuery对象(在最后一行)?ie:(函数($){…})(jQuery)


谢谢。

这将回答您的问题:

简单解释 它只是创建了一个闭包,您可以在其中使用
$
引用
jQuery
,即使它在

在jSang的回答(+1)中也进行了解释

从技术上讲,它只定义了一个匿名函数,该函数接受一个名为
$
的参数,并立即将其作为唯一的参数进行调用,因此,
$
充当此函数作用域内的
jQuery
的别名-请注意,全局作用域中的
$
在此闭包内不可访问

这意味着,如果原型在全局范围内使用
$
,则无法在闭包内使用
$
访问原型,因为引用jQuery的本地范围
$
优先

当然,如果在闭包中需要另一个库的方法,可以使用两个参数来定义它:
(function($j,$p){
,并调用它传递
(jQuery,$)
假设另一个库正在使用
$
命名空间。或者更简单地说,将闭包的局部范围变量别名为与其他库的全局范围变量不同的变量:
(函数($j){
,这意味着全局
$
仍然可以在函数的作用域内访问。请注意,后一种效果可能是不可取的,因为您无法完全确定用户为
$
分配了什么,除非您在文档中显式地编写它。我想需要多个库的插件有点过时我们就到此为止吧


稍微详细一点 页面中的一个实际关闭示例:

该闭包在其作用域中将
jQuery
化名为
$
,在您的用户拥有原型或其他使用
$
全局命名空间的库时非常有用。这使您的插件更加坚固,更不容易出错

无论jQuery是否控制$variable,都可以使用闭包,因此它是插件创作的理想选择。

想象一下,如果您的一个最终用户让jQuery处于noConflict模式,原型使用
$
名称空间,而您的插件试图用jQuery方法扩展
$
?混乱和小马

当然,您可以跳过闭包,将所有的
$
替换为
jQuery
,但这会使您的代码更长,对许多开发人员来说可读性更低


此外,如果您在理解闭包方面有困难,也有许多有用的答案,即使这个问题不需要太多关于闭包的深入知识。
:)

我会尽我所能回答这些问题。我在iPad上,所以如果我在iPad上,请耐心等待,我会遗漏一些技术细节。这些要点有点简化,但它们有助于描述发生了什么:)

  • 正在传入$,因为$可能被重写以表示其他内容。jQuery也可能处于NOC模式
  • (jQuery)所做的是立即调用已定义的内联函数。这称为自执行函数。虽然不正确(它不执行自身,但我们这样做),这就是它被称为的。它将jQuery传递给函数,这样我们就有了$的值。正如另一个答案中提到的,这会创建一个闭包。我建议用谷歌搜索“JavaScript闭包”。你会发现一些非常有价值的信息:)

希望对您有所帮助:)

您正在寻找的是使用新插件扩展jQuery“您正在扩展的部分$.fn”。它被包装在一个闭包块中

(function($){
//do sth
})(jQuery);

以上代码是您必须考虑的部分。 1.声明一个函数并调用它

var fn = function(b){ /*do sth like alert(b)*/ };
fn('hiiii');
2.较短的语法为

(function(b){ /*do sth like alert(b)*/ })('hiiii');
现在,如果将b替换为$,并用jQuery传递参数'hiiii',您将得到:

(function($){ /*do sth with $*/ })(jQuery);
正如您在第一个示例中看到的,b是方法参数,'hiiii'是调用时传递的参数。与上面的相同,$是方法参数,jQuery是调用时传递的参数

原因是避免与其他库发生冲突,因为$在几乎所有的JS库中都被广泛使用,所以您可以在其他库中使用jQuery


如果您想了解更多关于如何开发插件的信息,请访问

哦,很好,您很好地解决了我最初忽略的自执行方面,+1
(function($){ /*do sth with $*/ })(jQuery);