Javascript 理解基本jQuery结构
我正在学习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对象 我在其他几个地方也看到过这个问题,但我不理解的地方还没有得到解决。我
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);