(function(window,undefined) {
    undefined = 20;
    alert(undefined)//20
})(window,undefined)

(function (window, undefined) {
})(window, undefined)
undefined = 20;
alert(undefined)//undefined

# jQuery 源码第一行

var s = new $('.test');
var q = $('.test');

// s 和 q 的原型链不一样,但是取出来的东西是一样的。

(function(window, undefined) {
    var jQuery = function(selector, context) {
        // 默默的给做了一个 new
        return jQuery.fn.init(selector, context); // 这段代码被传为佳话
    };
    jQuery.fn = jQuery.prototype = {
        init: function(select, context){
    }
};
// jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype ???
 // 为什么绕? 有什么好处?
// 绝妙的地方
// 要把 jQuery.fn.init.prototype 给绕出来
jQuery.fn.init.prototype = jQuery.fn

// 1. 构造函数 2. prototype的方法
// new 第一步 返回一个 init 的函数,原型链上挂载了一个init的函数 没有主动执行
// init没调用,被搁置了
// 构造函数内部的 return new
// jQuery

// jQuery.fn.init.prototype = jQuery.fn = jQuery
// 把各自的原型链去掉
// jQuery.fn.init = jQuery
// new jQuery.fn.init 相当于 new 自己

// new 自己就好了,为什么就要绕?
// 为了得到 jQuery 原型链的方法。jQuery.fn上拥有原型链上的所有方法
})(window)

$.fn $.fn 上挂载一个方法。所有的jQuery都能够使用了。

jQuery.fn.extend 和 jQuery.extend 的区别

# jQuery 链式调用

var test = {
    a: function () {
        console.log('a')
        return this
    },
    b: function () {
        console.log('b')
        return this
    },
    c: function () {
        console.log('c')
    }
}
test.a().b().c()