[Javascript] 같은 줄에서 익명의 함수를 호출해야하는 이유는 무엇입니까?


Answers

자체 호출 함수라고합니다.

(function(){}) 을 호출 할 때 함수 객체를 반환하고 있습니다. 당신이 그것에 append () 할 때, 그것은 호출되고 몸체의 어떤 것이 실행된다. 그 ; 두 번째 호출이 실패하는 이유입니다.

Question

폐쇄에 대한 일부 게시물을 읽었으며이 곳을 보았습니다. 그러나 어떻게 작동하는지에 대한 명확한 설명이 없었습니다. 언제나 사용하라고 할 때마다 ... :

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();

우리는 새로운 익명의 함수를 생성하고 실행한다는 것을 알았습니다. 그래서이 간단한 코드가 작동해야합니다.

(function (msg){alert(msg)})('SO');

제 질문은 여기서 어떤 종류의 마술이 일어나는 것입니까? 나는 내가 다음과 같이 썼을 때 그것을 생각했다.

(function (msg){alert(msg)})

새로운 무명 함수는 함수 ""(msg)처럼 생성 될 것입니다 ...

그렇다면 왜 이것이 효과가 없습니까?

(function (msg){alert(msg)});
('SO');

왜 같은 줄에 있어야합니까?

몇 가지 게시물을 가르쳐 주시거나 설명을 주시겠습니까?




(function (msg){alert(msg)})
('SO');

익명 함수를 많은 JavaScript 프레임 워크가 사용하는 클로저로 사용하는 일반적인 방법입니다.

이 함수는 코드가 컴파일 될 때 자동으로 호출됩니다.

배치하는 경우 ; 첫 번째 줄에서 컴파일러는이를 두 개의 다른 줄로 처리했습니다. 따라서 위와 같은 결과를 얻을 수 없습니다.

이것은 또한 다음과 같이 쓰여질 수 있습니다 :

(function (msg){alert(msg)}('SO'));

자세한 내용은 JavaScript / 익명 함수 를 참조하십시오.




당신이했을 때 :

(function (msg){alert(msg)});
('SO');

세미콜론 때문에 함수를 끝냈습니다 ('SO') . 다음과 같이 작성하면

(function (msg){alert(msg)})
('SO');

효과가있을 것입니다.

실례 : http://jsfiddle.net/oliverni/dbVjg/




질문자 질문에 대한 나의 이해는 다음과 같습니다.

이 마술은 어떻게 작동합니까?

(function(){}) ('input')   // Used in his example

나는 틀릴지도 모른다. 그러나 사람들이 잘 알고있는 일반적인 습관은 다음과 같습니다.

(function(){}('input') )

이유는 JavaScript 괄호 AKA () 가 명령문을 포함 할 수 없기 때문에 파서가 function 키워드를 만날 때 함수 선언이 아닌 함수 표현식으로 파싱하는 것을 알고 있기 때문입니다.

출처 : 블로그 게시물 즉시 호출 된 함수 식 (IIFE)




익명의 함수는 이름이 ""인 함수가 아닙니다. 이것은 단순히 이름이없는 함수입니다.

JavaScript의 다른 값과 마찬가지로 함수에는 이름을 만들 필요가 없습니다. 다른 값과 마찬가지로 이름에 실제로 바인딩하는 것이 훨씬 더 유용하지만.

그러나 다른 값과 마찬가지로 이름에 바인딩하지 않고 사용하기를 원할 때도 있습니다. 그것이 바로 자기 발동 패턴입니다.

여기에는 함수와 숫자가 있고, 묶여 있지 않으며, 아무 것도하지 않고 결코 사용할 수 없습니다 :

function(){ alert("plop"); }
2;

따라서 다른 값과 마찬가지로 변수를 사용할 수 있도록 변수에 저장해야합니다.

var f = function(){ alert("plop"); }
var n = 2;

또한 syntatic sugar를 사용하여 함수를 변수에 바인딩 할 수 있습니다.

function f(){ alert("plop"); }
var n = 2;

그러나 이름을 지정하지 않아도 혼란이 적고 가독성이 떨어지면 바로 사용할 수 있습니다.

(function(){ alert("plop"); })(); // will display "plop"
alert(2 + 3); // will display 5

여기서 내 함수와 숫자는 변수에 바인딩되지 않지만 여전히 사용할 수 있습니다.

이런 식으로 말하자면 자체 호출 함수는 실제 가치가없는 것처럼 보입니다. 그러나 자바 스크립트 스코프 구분 기호는 함수이며 블록 ({})이 아니라는 사실을 명심해야합니다.

따라서 자체 호출 함수는 실제로 C ++, C # 또는 Java 블록과 동일한 의미를 갖습니다. 즉, 내부에서 생성 된 변수가 범위 밖으로 "누설되지"않습니다. 전역 범위를 오염시키지 않기 위해 자바 스크립트에서 매우 유용합니다.




이 대답은 엄격하게 질문과 관련이 없지만 이러한 종류의 구문 기능이 기능에만 국한된 것은 아닙니다. 예를 들어, 우리는 항상 다음과 같이 할 수 있습니다 :

alert(
    {foo: "I am foo", bar: "I am bar"}.foo
); // alerts "I am foo"

기능 관련. Function.prototype에서 상속받은 객체이므로 다음과 같은 작업을 수행 할 수 있습니다.

Function.prototype.foo = function () {
    return function () {
        alert("foo");
    };
};

var bar = (function () {}).foo();

bar(); // alerts foo

그리고 여러분도 알다시피, 우리는 함수를 실행하기 위해 괄호로 함수를 둘러 쌀 필요조차 없습니다. 어쨌든, 변수에 결과를 할당하려고하는 한.

var x = function () {} (); // this function is executed but does nothing

function () {} (); // syntax error

함수를 선언하는 즉시 함수를 사용하여 할 수있는 또 하나의 작업은 함수를 통해 new 연산자를 호출하고 객체를 얻는 것입니다. 다음은 동일합니다.

var obj = new function () {
    this.foo = "bar";
};

var obj = {
    foo : "bar"
};



IIFE는 단순히 함수를 분류하고 전역 변수 이름 공간을 "오염"시키지 않도록 msg 변수를 숨 깁니다. 실제로 10 억 달러 규모의 웹 사이트를 구축하지 않는 한 단순하게 유지하고 아래처럼하십시오.

var msg = "later dude";
window.onunload = function(msg){
  alert( msg );
};

Revealing Module Pattern을 사용하여 msg 속성의 네임 스페이스를 msg 수 있습니다.

var myScript = (function() {
    var pub = {};
    //myscript.msg
    pub.msg = "later dude";
    window.onunload = function(msg) {
        alert(msg);
    };
    //API
    return pub;
}());



표시하는 코드,

(function (msg){alert(msg)});
('SO');

문장으로 구성됩니다. 첫 번째는 함수 객체를 생성하는 표현식입니다 (저장되지 않기 때문에 가비지 수집됩니다). 두 번째는 문자열을 생성하는 표현식입니다. 함수를 문자열에 적용하려면 문자열을 함수의 인수로 함수에 전달해야합니다 (위에서 설명한 것처럼). 또는 실제로 변수에 함수를 저장해야합니다. 나중에, 여가 시간에 그것을 적용하십시오. 이렇게 :

var f = (function (msg){alert(msg)});
f('SO');

익명의 함수 (λ 함수)를 변수에 저장함으로써 효과적으로 이름을 부여합니다. 따라서 정규 함수를 정의 할 수도 있습니다.

function f(msg) {alert(msg)};
f('SO');



자체 실행 익명 기능입니다. 첫 번째 대괄호 집합은 실행할 표현식을 포함하고 두 번째 대괄호 집합은 해당 표현식을 실행합니다.

(function () {
    return ( 10 + 20 );
})();

Peter Michaux 는 중요한 괄호 쌍의 차이점에 대해 설명합니다.

부모 네임 스페이스에서 변수를 숨길 때 유용합니다. 함수 내의 모든 코드는 함수의 사적인 영역에 포함되어 있습니다. 즉, 함수의 외부에서 전혀 액세스 할 수 없으므로 실제로는 private이됩니다.

만나다:

  1. 폐쇄 (컴퓨터 과학)
  2. JavaScript 네임 스페이스
  3. 중요한 쌍의 자바 괄호