jQuery,解决命名冲突的问题

jquery源码解析noConflict

(function (global, factory) {
  "use strict";
  if (typeof module === "object" && typeof module.exports === "object") {
    module.exports = global.document
      ? factory(global, true)
      : function (w) {
          return factory(w);
        };
  } else {
    factory(global);
  }
})(
  typeof window !== "undefined" ? window : this,
  function (window) {
    var jQuery;
    var _jQuery = window.jQuery, // 1.在把jQuery挂到window之前,把之前的window的jQuery存起来(此时的window.jQuery很有可能是其他库声明的)
      _$ = window.$;
    // 当用户用到了noConflict,说明用户很想用window.$或者window.jQuery,这个变量名,但是又不想跟jquery库有关联
    // 此时用户要使用jquery库方法,就用noConflict函数返回值jQuery,如下步骤5
    jQuery.noConflict = function (deep) {
      // 3.因为下面的步骤2,导致了此时window.$就是我自己的jQuery,那么就还给你
      if (window.$ === jQuery) {
        window.$ = _$;
      }
      // 4.因为下面的步骤2,导致了此时window.jQuery就是我自己的jQuery,那么就还给你
      if (deep && window.jQuery === jQuery) {
        window.jQuery = _jQuery;
      }

      return jQuery; // 5.返回自己的jQuery库,给用户使用
    };
    window.jQuery = window.$ = jQuery; // 2.把局部的jQuery挂到window上
  }
);

使用noConflict(true),把$和jQuery名字都给别人

<body>
    <script>
        var $ = 'zan'
        var jQuery = 'lan'
    </script>
    <script src="./jquery.js"></script>
    <script>
        console.log(jQuery, '11111'); // 打印jquery函数
        console.log($, '22222'); // 打印jquery函数
        console.log(jQuery.noConflict(true), '33333');// 打印jquery函数
        console.log($, '44444');// zan 44444
        console.log(jQuery, '55555');// lan 55555
    </script>
</body>

使用noConflict,只把$名字都给别人

<body>
    <script>
        var $ = 'zan'
        var jQuery = 'lan'
    </script>
    <script src="./jquery.js"></script>
    <script>
        console.log(jQuery, '11111'); // 打印jquery函数
        console.log($, '22222'); // 打印jquery函数
        console.log(jQuery.noConflict(), '33333');// 打印jquery函数
        console.log($, '44444');// zan 44444
        console.log(jQuery, '55555');// 打印jquery函数
    </script>
</body>

noConflict原理

下面是部分jquery源码

(function (global, factory) {
  "use strict";
  if (typeof module === "object" && typeof module.exports === "object") {
    module.exports = global.document
      ? factory(global, true)
      : function (w) {
          if (!w.document) {
            throw new Error("jQuery requires a window with a document");
          }
          return factory(w);
        };
  } else {
    factory(global);
  }
})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
  var jQuery = function () {};
  var _jQuery = window.jQuery; // 记录别人声明的jQuery变量值
  var _$ = window.$;// 记录别人声明的$变量值
  jQuery.noConflict = function (deep) {
    if (window.$ === jQuery) {
      window.$ = _$; // 还原别人声明的$值
    }
    if (deep && window.jQuery === jQuery) {
      window.jQuery = _jQuery;// 还原别人声明的jQuery值
    }
    return jQuery;
  };
  return jQuery;
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值