16.jquery源码分析「复」

276 阅读1分钟
// 利用JS的临时死区「基于typeof检测一个未被声明的变量,结果undefined」
//  : 如果是在浏览器或者webview环境下运行JS,则A = window, 
//  : 如果是在node环境下执行,则A=global或者当前模块
var A = typeof window !== "undefined" ? window : this;
// 回调函数:把一个函数作为实参值,传递给另外一个函数执行,在执行过程中,把传递的函数执行
var B = function (window, noGlobal) {
  // 浏览器环境下
  // window = window
  // noGlobal = undefined
  "use strict";

  var jQuery = function (selector, context) {
    // ...
  }
  var _jQuery = function (selector, context) {
    // ...
  }
  if (typeof noGlobal === "undefined") {
    // 把私有的方法暴露到全局对象上
    window.jQuery = window.$ = jQuery
  }

};

/**
 * JS代码执行的环境
 *  + 浏览器环境 window -> GO
 *  + webview window -> GO
 *  + node golo
 */
(function (global, factory) {
  "use strict";
  if (typeof module === "object" && typeof module.exports === "object") {
    // 当前运行JS的环境是支持commonJS模块规范「node.js/webpack,浏览器默认不支持」
    // ...
  } else {
    // 浏览器或者webview环境
    // B(window)
    factory(global)
  }
})(A, B);


// =================================================================
;
(function () {
  function ModalPlugin() { }
  // ...

  // 支持amd编程思想

  // 防止冲突处理
  var _M = window.M
  ModalPlugin.noConflict = function noConflict() {
    if (window.M === ModalPlugin) {
      window.M = _M
    }
    return ModalPlugin
  }

  // 暴露API:支持浏览器 && CommonJS
  if (typeof window !== 'undefined') {
    window.M = window.ModalPlugin = ModalPlugin
  }
  if (typeof module === 'object' && typeof exports !== 'undefined') {

  }
})()

// =================================================================
/*
<script src='zepto.min.js'></script>
<script src='jquery.min.js'></script>

window.$ = Zepto
window.$ = jQuery

第一步:在导入jQuery的时候,把现有全局$记录下来
  var _$=windwo.$; => _$=Zepto
第二步:如果发现$使用权和别的类库冲突了,则转染使用权
  =》 var j = jQuery.noConflict()
    如果当前的$是jQuery,则window.$=_$=Zepto
    return jQuery; j代表的就是jQuery j()代替$

*/
// =================================================================
/*
<script src='jquery-1.11.3.min.js'></script>
<script src='jquery-3.5.1.min.js'></script>

deep 把上个版本jquery属性也转移了
*/