간단한 버전을 사용하면 더 이해할 수 있습니다. 첫 번째 준비 기능은 경고하는 것 이상을 수행하지 않습니다. 다른 두 가지는 흥미 롭습니다.
함수에는 범위가 있습니다. 즉, 변수를 사용하면 해당 변수가 발견 될 때까지 계층 구조로 올라갑니다.
두 번째 준비 기능에서 $
은 이 없으므로 이 없으므로 이됩니다.
그러나 세 번째 준비 블록에서 $
은 더 가까운 정의 - 인수 (function($) {
)로 전달 된 것이므로 Hi!
으로 이동하지 않습니다. 이 $
은 jQuery 함수 (예 : 해당 함수 $ == jQuery
)가 jQuery의 준비 기능이 구현되는 방식입니다.
그래서 :
var $ = 'Hi!';
jQuery(function() {
alert('$ = ' + $); // in this scope, $ will refer to the 'Hi!'
});
jQuery(function($) { // the $ here will 'shadow' the $ defined as 'Hi!'
alert('$ = ' + $); // in this scope, $ will refer to jQuery
});
지금 당신의 질문은 다른 라이브러리와 충돌에 관한 것입니다. 다른 라이브러리 (예 : 프로토 타입)도 $
심볼을 사용하므로 라이브러리를 호출하는 편리한 바로 가기입니다. 제공 한 마지막 준비 함수를 사용하면 이 될 수 있습니다. $
은 jQuery가 그 함수 (첫 번째 인수로)에 전달할 때 jQuery를 참조합니다.
두 번째 준비 함수에서 $
도 Prototype으로 설정되었을 수 있으며 $
과 함께 jQuery를 호출하는지 여부가 확실하지 않을 수 있습니다. 귀하의 예에서는 Hi!
이며 jQuery는 아닙니다. 프로토 타입 인 경우 똑같습니다. 고려 : 한편
// Prototype is loaded here, $ is referring to Prototype
jQuery(function() {
$('selector').addClass('something'); // Oops - you're calling Prototype with $!
});
을 :
// Prototype is loaded here, $ is referring to Prototype
jQuery(function($) { // this $ is shadowing Prototype's $, this $ is jQuery
$('selector').addClass('something'); // Yay - you're calling jQuery with $
});
@ Beefyhalo - '$'는 이미'jQuery() '처리기 안에 있으면 특별한 의미가 있습니까? 즉,'jQuery (function (argument) {...}) '에서 전달 된 인수가 여전히'$'와 동일한 문제를 해결합니까? – dopatraman
jQuery는 jQuery 핸들러의 첫 번째 인수에 자신을 할당합니다. 첫 번째 인수의 이름이 무엇이든 관계없이 jQuery가이 인수에 할당됩니다. 따라서 jQuery (function (argument) {...},'jQuery (function ($) {...'및'jQuery (function (someOtherArgument) {...' 인수 === $ === someOtherArgument' – beefyhalo
@ Beefyhalo - 감사합니다. – dopatraman