常常看到许多jquery插件是这种形式:javascript
;(function( $, window, document, undefined ){}){ //...code }(jquery,window,document)
一开始本身也是不太清楚,后台查了许多资料博客,基本了解大意,因此总结出来,以供以后查阅更正。java
1.自调函数(function(){})()jquery
这是一个自调函数,函数定义后自行调用。将匿名函数放在括号以内,并紧跟一个括号。第二个括号的意思是“当即调用”。同时第二个括号也是向匿名函数传递参数的地方。编程
好比:浏览器
(function(){ alert(1); //输出1 })(); (function(name){ alert(name); //输出xiaoming })("xiaoming");
使用自调匿名函数好处是不会产生任何全局变量。缺点是没法重复执行(除非放在某个循环或其余函数中)。所以,匿名自调函数适合只执行一次性或初始化的任务。对于插件来讲,这种定义方式,既不会产生全局变量,同时引入一次就够了。
据此回到插件的这种写法,能够理解为,该插件须要传入jquery,window,document,undefinded;几个参数做用为:框架
(a)$实参:$是jquery的简写,不少方法和类库也使用$,这里$接受jQuery对象,也是为了不$变量冲突,保证插件能够正常运行。jquery插件
(b)window, document实参分别接受window, document对象,window, document对象都是全局环境下的,而在函数体内的window, document实际上是局部变量,不是全局的window, document对象。这样作有个好处就是能够提升性能,减小做用域链的查询时间,若是你在函数体内须要屡次调用window 或 document对象,这样把window 或 document对象看成参数传进去,这样作是很是有必要的。固然若是你的插件用不到这两个对象,那么就不用传递这两个参数了。函数
(c)最后剩下一个undefined形参了,那么这个形参是干什么用的呢,看起来是有点多余。undefined在老一辈的浏览器是不被支持的,直接使用会报错,js框架要考虑到兼容性,所以增长一个形参undefined性能
2.“;”分号做用:防止多个文件压缩合并觉得其余文件最后一行语句没加分号,而引发合并后的语法错误。插件
总结:插件这种形式,本质就是定义一个匿名自调函数,同时为了提升性能或者兼容性,增长了“;”传入jquery,window,document,undefinded参数。
参考资料:《javascript面向对象编程》Stoyan Stefanov著;
《高性能javascript》