[javascript] (function () {}) () 구조는 어떻게 작동하며 사람들이 왜 그것을 사용합니까?

(function() {})()jQuery에 특화된 사촌 (function($) {})(jQuery)은 자바 스크립트 코드에서 항상 팝업됩니다.

이러한 구성은 어떻게 작동하며 어떤 문제를 해결합니까?

감사의 예



답변

JavaScript 프레임 워크의 인기가 높아짐에 따라이 $기호는 다양한 경우에 사용되었습니다. 따라서 가능한 충돌을 줄이기 위해 다음 구성을 사용할 수 있습니다.

(function ($){
  // Your code using $ here.
})(jQuery);

특히, 이것은 주 jQuery 객체를 매개 변수로 전달하는 즉시 실행되는 익명 함수 선언입니다 . 해당 함수 내 에서 다른 프레임 워크가 범위에 있는지 걱정하지 않고 해당 개체를 참조하는 데 사용할 수 있습니다 .$


답변

이것은 변수 범위를 제한하는 데 사용되는 기술입니다. 변수가 전역 네임 스페이스를 오염시키는 것을 방지하는 유일한 방법입니다.

var bar = 1; // bar is now part of the global namespace
alert(bar);

(function () {
   var foo = 1; // foo has function scope
   alert(foo);
   // code to be executed goes here
})();


답변

1) 익명 함수를 정의하고 바로 실행합니다.

2) 일반적으로 원치 않는 코드로 전역 네임 스페이스를 오염시키지 않도록 수행됩니다.

3) 당신은 그것으로부터 몇 가지 메소드를 노출해야합니다. 내부 선언은 “비공개”입니다. 예를 들면 :

MyLib = (function(){
    // other private stuff here
    return {
        init: function(){
        }
    };

})();

또는, 또는 :

MyLib = {};
(function({
    MyLib.foo = function(){
    }
}));

요점은 여러 가지 방법으로 사용할 수 있지만 결과는 동일하다는 것입니다.


답변

즉시 호출되는 익명 함수입니다. 먼저 함수를 만든 다음 호출하면 동일한 효과를 얻을 수 있습니다.

(function(){ ... })();

다음과 같이 작동합니다.

temp = function(){ ... };
temp();

명명 된 함수를 사용하여 동일한 작업을 수행 할 수도 있습니다.

function temp() { ... }
temp();

jQuery 특정이라고 부르는 코드는 jQuery 객체를 사용한다는 의미에서만 가능합니다. 즉시 호출되는 매개 변수가있는 익명 함수입니다.

두 단계로 동일한 작업을 수행 할 수 있으며 원하는 매개 변수로 수행 할 수 있습니다.

temp = function(answer){ ... };
temp(42);

이것이 해결하는 문제는 함수의 코드에 대한 클로즈를 생성한다는 것입니다. 전역 네임 스페이스를 오염시키지 않고 변수를 선언 할 수 있으므로 한 스크립트를 다른 스크립트와 함께 사용할 때 충돌 위험을 줄일 수 있습니다.

jQuery의 특정 경우에는 이름 $를 jQuery의 별칭으로 선언하지 않는 호환성 모드에서 사용합니다. jQuery 객체를 클로저로 보내고 매개 변수 이름을 $로 지정하면 호환성 모드없이 동일한 구문을 사용할 수 있습니다.


답변

여기 에서 첫 번째 구성이 변수에 대한 범위를 제공한다고 설명 합니다.

변수는 자바 스크립트의 함수 수준에서 범위가 지정됩니다. 이것은 변수가 블록으로 범위가 지정된 C # 또는 Java와 같은 언어에서 익숙한 것과 다릅니다. 이것이 의미하는 바는 루프 또는 if 문 내에서 변수를 선언하면 전체 함수에서 사용할 수 있다는 것입니다.

함수 내에서 변수의 범위를 명시 적으로 지정해야하는 경우 익명 함수를 사용하여이를 수행 할 수 있습니다. 실제로 익명 함수를 만든 다음 바로 실행할 수 있으며 내부의 모든 변수는 익명 함수로 범위가 지정됩니다.

(function() {
  var myProperty = "hello world";
  alert(myProperty);
})();
alert(typeof(myProperty)); // undefined


답변

이를 수행하는 또 다른 이유 $는 사용 중인 프레임 워크의 연산자에 대한 혼란을 제거하는 것 입니다. 예를 들어 jQuery를 강제하려면 다음을 수행하십시오.

;(function($){
   ... your jQuery code here...
})(jQuery);

$연산자를 매개 변수로 전달하고 jQuery에서 호출하면 $다른 프레임 워크가로드 된 경우에도 함수 내의 연산자가 jQuery에 잠 깁니다.


답변

이 구조의 또 다른 용도는 클로저에 사용될 지역 변수의 값을 “캡처”하는 것입니다. 예를 들면 :

for (var i = 0; i < 3; i++) {
    $("#button"+i).click(function() {
        alert(i);
    });
}

위의 코드는 세 개의 버튼이 모두 “3”으로 팝업되도록합니다. 반면에 :

for (var i = 0; i < 3; i++) {
    (function(i) {
        $("#button"+i).click(function() {
            alert(i);
        });
    })(i);
}

이렇게하면 예상대로 세 개의 버튼이 “0”, “1”, “2”로 표시됩니다.

그 이유는 클로저 가 해당 변수의 현재 값을 보유하는 둘러싸는 스택 프레임에 대한 참조를 유지하기 때문 입니다. 클로저가 실행되기 전에 이러한 변수가 변경되면 클로저는 클로저가 생성 된 시점의 값이 아닌 최신 값만 볼 수 있습니다. 위의 두 번째 예에서와 같이 다른 함수 안에 클로저 생성을 래핑하면 변수의 현재 값 i이 익명 함수의 스택 프레임에 저장됩니다.