jQuery源码 入口分析

238 阅读2分钟

jQuery

jQuery是对JavaScript的一些常用操作进行了一个封装成的一个库。简化了对简化了对html的操作、事件处理、动画、和Ajax交互。

闭包

jquery入口函数是一个立即执行函数,JavaScript的闭包的形成与变量的作用域有关,本质上是词法作用域雨变量的生命周期。当变量不再被使用后就会被销毁,但是当变量一直在背引用的时候就会保留在内存中。

闭包的好处:

  1. 可以把一些不需要暴露在全局的变量“私有变量”。
  2. 可以延长内部变量的声明周期

缺点:

  1. 私有化变量太多会引起内存泄露,我觉得这个问题一般不存在这种问题。主要造成内存泄露的原因是使用闭包造成了循环引用,如果闭包的作用域链中保存着DOM节点,造成内存泄露,因为在IE浏览器中是采用引用计数法这种垃圾回收机制,而现在大部分浏览器中都使用了标记计数法。而且解决这个问题的办法是我们在使用完成后把这个使用的变量赋值为null就可以了。
/**
 * @param  {[object]} global  window 
 * @param  {[function]} factory jquery
 */
(function (gloal, factory) {
    if (typeof module === 'object' && typeof module.exports === 'object'){
        module.exports = global.document ? fcatory(global, true): function (w) {
            if (!w.document) {
                throw new Error('jquery requires a window with document')
            } 
            return    factory(w)
        }
    } else {
        factory(global)
    }

})(typeof window !== 'undefined' ? window : this, function (window, noGlobal){

})

这段代码非常好理解,传入两个参数window、jquery方法。

    if (typeof module === 'object' && typeof module.exports === 'object'){
        module.exports = global.document ? fcatory(global, true): function (w) {
            if (!w.document) {
                throw new Error('jquery requires a window with document')
            } 
            return    factory(w)
        }
    }

这段代码主要是对common.js规范做了一个处理,如果符合规范直接导出factory,并传入window,否则就看rquire('jquery')的时候会不会传入一个window,如果传入了就直接返回facotry(window),否则就抛出错误。 最后是平时html引入jquery.js 的处理直接fatory(window)。