backbone.js 스크린 캐스트에서 훌륭한 peepcode 데모 코드를 살펴보고 있습니다. 그 안에 백본 코드는 모두 jQuery 객체를 전달하는 익명 함수로 묶여 있습니다.
(function($) {
// Backbone code in here
})(jQuery);
내 백본 코드에서 jQuery DOM ‘ready’이벤트에 모든 코드를 래핑했습니다.
$(function(){
// Backbone code in here
});
첫 번째 접근 방식의 요점 / 장점은 무엇입니까? 이렇게하면 jQuery 객체가 함수 인수로 전달되는 즉시 실행되는 익명 함수가 생성되어 $가 jQuery 객체임을 효과적으로 보장합니다. 이것이 유일한 요점입니까-jQuery가 ‘$’에 바인딩되어 있는지 확인하거나이를 수행하는 다른 이유가 있습니까?
답변
여러분이 보여준 두 개의 코드 블록은 실행시기와 이유가 크게 다릅니다. 그들은 서로 배타적이지 않습니다. 그들은 동일한 목적을 제공하지 않습니다.
자바 스크립트 모듈
(function($) {
// Backbone code in here
})(jQuery);
이것은 즉시 호출 함수로 구현 된 “JavaScript 모듈”패턴입니다.
- http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript
- http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
이 코드의 목적은 “모듈화”, 개인 정보 보호 및 코드 캡슐화를 제공하는 것입니다.
이 구현은 호출하는 (jQuery)
괄호에 의해 즉시 호출되는 함수입니다 . jQuery를 괄호 안에 전달하는 목적은 전역 변수에 로컬 범위를 제공하는 것입니다. 이것은 $
변수 를 찾는 오버 헤드의 양을 줄이는 데 도움이되며 경우에 따라 축소 자에 대한 더 나은 압축 / 최적화를 허용합니다.
즉시 호출하는 함수가 즉시 실행됩니다. 함수 정의가 완료되는 즉시 함수가 실행됩니다.
jQuery의 “DOMReady”기능
이것은 jQuery의 “DOMReady”함수에 대한 별칭입니다 : http://api.jquery.com/ready/
$(function(){
// Backbone code in here
});
jQuery의 “DOMReady”함수는 DOM이 JavaScript 코드에 의해 조작 될 준비가되면 실행됩니다.
백본 코드의 모듈 대 DOMReady
jQuery의 DOMReady 함수 내에 백본 코드를 정의하는 것은 잘못된 형식이며 잠재적으로 애플리케이션 성능을 손상시킵니다. 이 함수는 DOM이로드되고 조작 할 준비가 될 때까지 호출되지 않습니다. 즉, 개체를 정의하기 전에 브라우저가 DOM을 한 번 이상 파싱 할 때까지 기다립니다.
DOMReady 함수 외부에서 Backbone 개체를 정의하는 것이 더 좋습니다. 저는 다른 많은 사람들 중에서 JavaScript 모듈 패턴 내에서이 작업을 수행하여 코드에 대한 캡슐화 및 개인 정보 보호를 제공하는 것을 선호합니다. 저는 “Revealing Module”패턴 (위의 첫 번째 링크 참조)을 사용하여 모듈 외부에서 필요한 비트에 대한 액세스를 제공하는 경향이 있습니다.
DOMReady 함수 외부에서 개체를 정의하고 개체를 참조 할 수있는 방법을 제공함으로써 브라우저가 JavaScript 처리를 앞당기 고 잠재적으로 사용자 경험을 가속화 할 수 있습니다. 또한 물건을 움직일 때 더 많은 DOMREady 함수를 만드는 것에 대해 걱정할 필요없이 물건을 움직일 수 있기 때문에 코드를 더 유연하게 만듭니다.
Backbone 객체를 다른 곳에 정의하더라도 여전히 DOMReady 함수를 사용할 것입니다. 그 이유는 많은 Backbone 앱이 어떤 방식 으로든 DOM을 조작해야하기 때문입니다. 이렇게하려면 DOM이 준비 될 때까지 기다려야하므로 DOMReady 함수를 사용하여 정의 된 후 애플리케이션을 시작해야합니다.
웹에서 이에 대한 많은 예제를 찾을 수 있지만 다음은 Module 및 DOMReady 함수를 모두 사용하는 매우 기본적인 구현입니다.
// Define "MyApp" as a revealing module
MyApp = (function(Backbone, $){
var View = Backbone.View.extend({
// do stuff here
});
return {
init: function(){
var view = new View();
$("#some-div").html(view.render().el);
}
};
})(Backbone, jQuery);
// Run "MyApp" in DOMReady
$(function(){
MyApp.init();
});
답변
부수적으로 $를 익명 함수에 대한 인수로 보내면 $ 함수가 많이 호출되는 경우 약간의 긍정적 인 성능 영향을주는 해당 함수에 $ 로컬이됩니다. 이는 자바 스크립트가 변수에 대한 로컬 범위를 먼저 검색 한 다음 창 범위 ($가 일반적으로있는 곳)까지 아래로 이동하기 때문입니다.
답변
사용 된 경우에도 해당 클로저 내부에서 항상 사용할 수 있습니다 .$
$.noConflict()
이 폐쇄가 없으면 전체 시간 jQuery
대신 사용해야 합니다 $
.
답변
$ 변수의 잠재적 충돌을 방지하기위한 것입니다. $라는 변수를 다른 것이 정의하면 플러그인이 잘못된 정의를 사용할 수 있습니다.
자세한 내용은 http://docs.jquery.com/Plugins/Authoring#Getting_Started 를 참조하십시오.
답변
둘 다 사용하십시오.
라이브러리 충돌을 방지하고 $로 예상 한대로 jQuery를 사용할 수 있는지 확인하기 위해 jQuery를 전달하는 자체 호출 함수입니다.
DOM이로드 된 후에 만 javascript를 실행하는 데 필요한 .ready () 바로 가기 메서드 :
(function($) {
$(function(){
//add code here that needs to wait for page to be loaded
});
//and rest of code here
})(jQuery);