>  기사  >  웹 프론트엔드  >  jQuery.noConflect()_jquery를 쉽게 처리

jQuery.noConflect()_jquery를 쉽게 처리

WBOY
WBOY원래의
2016-05-16 15:15:451144검색

jQuery는 가장 널리 사용되는 프런트엔드 프레임워크 중 하나이며 이를 기반으로 수많은 타사 라이브러리와 플러그인이 개발되었습니다. 전역 네임스페이스 오염을 방지하기 위해 jQuery는 변수 충돌을 해결하는 jQuery.noConflect() 메서드를 제공합니다. 이 방법은 의심할 여지 없이 매우 효과적이다. 불행하게도 jQuery의 공식 문서에는 이 방법이 충분히 명확하게 설명되어 있지 않으며, 많은 개발자가 jQuery.noConflect()를 호출할 때 정확히 어떤 일이 발생하는지 모르기 때문에 이를 사용할 때 많은 문제가 발생합니다. 그럼에도 불구하고 jQuery.noConstrict()의 구현 원리는 여전히 웹 개발자가 배우고 숙달할 가치가 있으며 전역 네임스페이스 오염과 같은 문제를 해결하는 강력한 도구가 될 수 있습니다.

jQuery.noContribute()의 역할은 무엇인가요?
jQuery.noConstrict()는 단 하나의 목적으로만 존재합니다. 즉, 동일한 페이지에 여러 jQuery 인스턴스, 특히 다양한 버전의 jQuery를 로드할 수 있도록 해줍니다. 한 페이지에 여러 다른 버전의 jQuery 객체를 로드/사용해야 하는 이유가 무엇인지 궁금할 것입니다. 일반적으로 두 가지 상황이 있습니다. 첫 번째 경우에는 비즈니스 코드가 최신 버전의 jQuery 라이브러리를 사용하고, 선택한 타사 플러그인은 이전 버전의 jQuery 라이브러리에 의존합니다. 두 번째 경우에는 이미 있는 시스템을 유지 관리하고 있습니다. 비즈니스 여러 가지 이유로 코드는 이전 버전의 jQuery 라이브러리를 참조하고 새로 개발된 모듈은 다른 버전의 jQuery 라이브러리를 사용합니다. 두 경우 모두 jQuery 개체/메서드 충돌 문제에 직면해야 합니다. 다행스럽게도 jQuery.noConstrict()는 이 문제를 해결하는 데 도움이 됩니다.

jQuery가 로드되면 어떻게 되나요?
jQuery가 페이지에서 참조/로드되면 자체 실행 함수(익명 함수)에 캡슐화됩니다. jQuery가 제공하는 모든 변수, 함수 및 개체는 익명 함수 내부의 실행 환경에 있으며 외부에서 호출할 수 없습니다. 환경을 보호합니다. 글로벌 네임스페이스 오염을 방지합니다.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

jQuery는 익명 함수 내부에 jQuery와 $라는 두 개의 전역 개체를 정의하여 외부 환경에 자신을 노출합니다. 개발자가 사용하는 다양한 공개 메소드는 jQuery.ajax(), jQuery.css() 등과 같은 두 객체를 통해 액세스됩니다. 처음에는 익명 함수 내부의 동일한 개체 jQuery(개인 변수)를 가리키며 이를 통해 익명 함수 내부의 개인 변수와 함수에 액세스합니다. 이를 통해 익명 함수의 내부 전용 변수와 함수가 실행된 후에도 메모리에 계속 남아 있을 수 있으며 JavaScript 가비지 수집 메커니즘에 의해 지워지지 않습니다.

window.jQuery = window.$ = jQuery;

페이지에서 jQuery를 로드할 때 현재 페이지에는 이미 두 개의 전역 변수인 jQuery와 $가 있을 수 있습니다(예를 들어 다른 타사 라이브러리가 로드되고 내부적으로 정의되기도 함). 이로 인해 기존 개체가 덮어썼습니다(전역 네임스페이스 오염). 이 문제를 해결하기 위해 jQuery는 기존 전역 변수를 내부적으로 캐시하고 후속 호출을 위해 이를 개인 변수 _jQuery 및 _$에 저장합니다. 따라서 jQuery 라이브러리가 페이지에 로드될 때 jQuery 및 $ 개체가 아직 존재하지 않으면 _jQuery 및 _$는 모두 정의되지 않습니다. 그렇지 않으면 기존 jQuery 및 $에 대한 참조를 저장합니다(아마도 타사에서 가져온 것임). 이전에 참조된 라이브러리) 또는 다른 버전의 jQuery 라이브러리). 이후에 jQuery는 이 두 전역 변수를 덮어쓰고 위에서 설명한 대로 외부 환경에 노출됩니다. 이 시점에서 페이지의 전역 변수 jQuery 및 $는 방금 소개한 jQuery 라이브러리를 가리켰습니다.

// Map over jQuery in case of overwrite
_jQuery = window.jQuery,

// Map over the $ in case of overwrite
_$ = window.$,

// Otherwise expose jQuery to the global object as usual
window.jQuery = window.$ = jQuery;

jQuery.noContribute()의 마법 같은 효과?
 당신이 유지 관리하는 시스템이 이미 jQuery 라이브러리 버전 1.7.0을 참조하고 있고 새로 추가된 함수에서 jQuery 라이브러리 버전 1.10.2를 참조한다고 가정합니다. 그렇다면 jQuery 1.7.0을 재사용하거나 두 버전의 jQuery 라이브러리를 동시에 사용할 수 있는 방법이 있습니까? 대답은 '예'입니다. 즉, jQuery.noConflect()입니다. 실제로 jQuery.noConflect()를 사용하면 전역 변수 jQuery 및 $를 이전에 참조된 객체로 즉시 리디렉션할 수 있습니다. 놀랍지 않나요? 이것이 jQuery가 외부 세계에 노출되기 전에 이전에 참조된 객체를 내부적으로 캐시하는 이유입니다.
− jQuery.noConstrict()는 선택적 부울 매개변수를 허용하며 일반적으로 기본값은 false입니다. 이 매개변수는 어떤 영향을 미치나요? 실제로는 매우 간단합니다. jQuery.noConflect() 또는 jQuery.noConflect(false)가 호출되면 전역 변수 $만 이전 참조 값으로 재설정됩니다. $는 이전 참조 값으로 재설정됩니다. jQuery와 $는 모두 이전 참조 값으로 재설정됩니다. 이는 매우 중요하므로 명심하는 것이 좋습니다. jQuery.noConflect(false/true)를 호출하면 현재 jQuery 인스턴스가 반환됩니다. 이 기능을 사용하면 jQuery의 이름을 바꿀 수 있습니다.

// "Renaming" jQuery
var jayquery = jQuery.noConflict( true );
// Now we can call things like jayquery.ajax(), jayquery.css(), and so on

우리가 마법의 noContribute()를 실제로 이해하고 있는지 테스트하기 위해 또 다른 코드 조각을 살펴보겠습니다.



<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>