jQuery的noConflict()代码没有意义

时间:2019-04-09 07:44:35

标签: javascript jquery

我不了解noConflict函数的源代码。它在 jQuery 3.3.1 中:

jQuery.noConflict = function( deep ) {
  if ( window.$ === jQuery ) {
    window.$ = _$;
  }
  if ( deep && window.jQuery === jQuery ) {
    window.jQuery = _jQuery;
  }
  return jQuery;
};

为什么他们检查window.jQuery和jQuery之间的严格相等性? (deep && window.jQuery === jQuery)

window.jQuery除了jQuery之外还可以包含什么?

window.jQuery可以等于jQuery,我想可以是未定义的,但是没有别的。我认为其他库不会将jQuery放在窗口对象上。 然后,从“ Professional jQuery”(本书)中获得以下代码:

noConflict: function( deep ) {
     window.$ = _$;
     if ( deep ) {
        window.jQuery = _jQuery;
     }
     return jQuery;
}

不使用window.jQuery === jQuery.

1 个答案:

答案 0 :(得分:0)

这是在加载多个版本的jQuery的情况下。让我们在这里做一个样本

function PseudoJQuery(version) {
  //keep track of version
  this.version = version;

  //keep previous $ and jQuery values
  var _$ = window.$;
  var _jQuery = window.jQuery;

  //assign the current version
  var jQuery = this;
  window.$ = jQuery;
  window.jQuery = jQuery;

  //re-use the jQuery.noConflict
  this.noConflict = function(deep) {
    if (window.$ === jQuery) {
      window.$ = _$;
    }
    //remove the check
    if (deep /*&& window.jQuery === jQuery */) {
      window.jQuery = _jQuery;
    }
    return jQuery;
  };
}

//load multiple versions of our jQuery
var j2 = new PseudoJQuery(2);
var j3 = new PseudoJQuery(3);

console.log("version after loading", window.jQuery.version);

j2.noConflict(true);

console.log("version after noConflict", window.jQuery.version); //error

因此,这是jQuery初始化时的简化版本以及调用noConflict时尝试还原的简化版本。 之所以失败,是因为当我们调用j2.noConflict时,window.jQuery变量将返回其初始状态-undefined,从而破坏了版本3的安装。

检查到位后,jQuery的 current 版本将仅在调用noConflict时销毁,而在其他jQuery安装中不会销毁。

function PseudoJQuery(version) {
  //keep track of version
  this.version = version;

  //keep previous $ and jQuery values
  var _$ = window.$;
  var _jQuery = window.jQuery;

  //assign the current version
  var jQuery = this;
  window.$ = jQuery;
  window.jQuery = jQuery;

  //re-use the jQuery.noConflict
  this.noConflict = function(deep) {
    if (window.$ === jQuery) {
      window.$ = _$;
    }

    if (deep && window.jQuery === jQuery) {
      window.jQuery = _jQuery;
    }
    return jQuery;
  };
}

//load multiple versions of our jQuery
var j2 = new PseudoJQuery(2);
var j3 = new PseudoJQuery(3);

console.log("version after loading", window.jQuery.version);

j2.noConflict(true);

console.log("version after noConflict", window.jQuery.version);