jQuery 소스 분석의 noConflict()

1997 단어 javascript
noConflict()
conflict () 는 $ 또는 jQuery 의 제어권을 첫 번째로 그것을 실현한 라이브러리에 양보하여 jQuery 다른 라이브러리의 $대상과 충돌하지 않도록 합니다.
jQuery의 소스는 다음과 같습니다.

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

원본 코드를 분석하기 전에 우리는 몇 가지 점을 주의해야 한다.
  • jQuery 파일은 다른 충돌 라이브러리 파일 다음에 가져와야 합니다.noConflict () 는 jQuery 파일을 가져온 후에 사용해야 합니다.
  • 충돌을 일으킨 라이브러리에는 $또는 jQuery의 명칭 공간이 있어야 합니다. 그렇지 않으면 _jQuery = window.jQuery_$ = window.$는 의미가 없습니다
  • 다음은 소스 코드 분석을 시작합니다.
    만약 우리가 두 개의 라이브러리를 도입했다면,prototype.js 및 jQuery.js.prototype.js 앞, jQuery.js는 뒤에 있고prototype.js에 $이름공간이 존재합니다
    //        jQuery           ,     prototype.js    $  jQuery    
    var _jQuery = window.jQuery,_$ = window.$;
    jQuery.noConflict = function(deep){
    //         window.$   jQuery   ,       prototype.js  $   _$   window.$    
        if(window.$ === jQuery){
            window.$ = _$;
        }
        //      deep true     window.jQuery    jQuery   ,       prototype.js  jQuery   _jQuery   window.jQuery    
        if(deep && window.jQuery === jQuery){
        window.jQuery = _jQuery;
        }
    };

    위의 원본 코드를 분석한 후에 몇 가지 생각해 볼 것이 있습니다.
    왜 noConflict () 를 호출한 후에 window.$벌써 jQuery야?
    이 문제는 jQuery 코드의 마지막 부분에 설명되어 있습니다.
    if ( typeof window === "object" && typeof window.document === "object" ) {
        window.jQuery = window.$ = jQuery;
    }
    

    만약prototype.js에 충돌하는 이름 공간이 없습니다. noConflict () 를 호출하면 어떻게 됩니까?
    만약 이전에 충돌하는 명명 공간이 없었다면 _&_jQuery는 모두undefined이기 때문에 window.$window.jQuery는undefined로 덮일 것이다.즉 noConflict () 를 호출하면 jQuery는 $ 또는 jQuery 의 제어권을 넘겨주고 이전에 명명 공간 충돌이 있었든 없든
    참조 자료:http://www.imooc.com/learn/172

    좋은 웹페이지 즐겨찾기