1.11自调用匿名函数self-invoking anonymous function
( function(widow,undefined){
//code ....
})(window)
- 这是一个自调用匿名函数。那到底是什么呢?在第一括号内,创建一个匿名函数;第二个括号,表示立即执行。 → what
- 那么为什么要创建一个“自调用匿名函数”呢?
4.为什么要传入window呢?
通过传入window变量,使得window由全局变量变为局部变量,当在jQuery代码块中访问window时,不需要将作用域链回退到顶层作用域,这样可以更快的访问window;这还不是关键所在,更重要的是,将window作为参数传入,可以在压缩代码时进行优化,看看jquery-1.6.1.min.js:
(function(a,b){})(window);// window被优化为a |
5.为什么要在在参数列表中增加undefined呢?
在自调用匿名函数的作用域内,确保undefined是真的未定义。因为undefined能够被重写,赋予新的值。
undefined = "now it's defined"; alert( undefined ); |
浏览器测试结果:
浏览器 | 测试结果 | 结论 |
ie | now it's defined | 可以改变 |
firefox | undefined | 不能改变 |
chrome | now it's defined | 可以改变 |
opera | now it's defined | 可以改变 |
6.注意到源码最后的分号了吗?
分号是可选的,但省略分号并不是一个好的编程习惯;为了更好的兼容性和健壮性,请在每行代码后加上分号并养成习惯。
1.12 总体架构
接下来看看在自调用匿名函数中都实现了什么功能,按照代码顺序排列:
(function( window,undefined) {
//构造jQuery对象
varjQuery =function( selector, context ) {
returnnewjQuery.fn.init( selector, context, rootjQuery );
}
//工具函数Utilities
//异步队列Deferred
//浏览器测试Support
//数据缓存Data
//队列queue
//属性操作Attribute
//事件处理Event
//选择器Sizzle
// DOM遍历
// DOM操作
// CSS操作
//异步请求Ajax
//动画FX
//坐标和大小
window.jQuery = window.$ = jQuery;
})(window);
通过jQuery(xxx)的调用实现没有生成对象,它的this是指向window对象的,那么jQuery的那些实例方法是怎么样继承过来的呢?接下来看一下:
varjQuery =window.jQuery=function( selector, context ) {
returnnewjQuery.fn.init( selector, context, rootjQuery );
}
这是jQuery的总入口,jQuery对象不是通过new jQuery来继承prototype中的方法,而是jQuery.fn.init函数生成的对象。