javascript - meta 태그 - 같은 줄에서 익명의 함수를 호출해야하는 이유는 무엇입니까?



9 Answers

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

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

Question

html head 태그

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

// 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');

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

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




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

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 블록과 동일한 의미를 갖습니다. 즉, 내부에서 생성 된 변수가 범위 밖으로 "누설되지"않습니다. 전역 범위를 오염시키지 않기 위해 자바 스크립트에서 매우 유용합니다.




표시하는 코드,

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

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

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

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

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



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

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"
};



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

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

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

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

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

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

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




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

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

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

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

만나다:

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



당신이했을 때 :

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

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

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

효과가있을 것입니다.

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




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

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

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

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

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

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

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




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;
}());


Related