programing

JavaScript 익명 함수 즉시 호출 / 실행 (표현식 대 선언)

nasanasas 2020. 12. 13. 09:44
반응형

JavaScript 익명 함수 즉시 호출 / 실행 (표현식 대 선언)


중복 가능성 :
JavaScript에서 함수 표현식과 선언의 차이점은 무엇입니까?
JavaScript의 캡슐화 된 익명 함수 구문 설명

이유 :

(function () {
    //code
}());

이:

var f = function () {
    //code
}();

작동하는 동안 :

function () {
    //code
}();

하지 않습니다? 익명 함수가 정의되고 즉시 호출됩니다. 누군가 그것을 설명하는 JavaScript / ECMAScript 표준에서 인용 할 수 있습니까?

업데이트 : 답변 감사합니다! 그래서 그것은 함수 표현 대 함수 선언에 관한 것 입니다. 참조 이 스택 오버플로 대답 , ECMAScript를 표준 (13), 그리고이 위대한 기사 : 명명 된 함수 표현식은 신화화 .

답변을 요약하려면 :

  1. 첫 번째 스 니펫은 그룹화 연산자 ()가 적용 되었기 때문에 표현식으로 해석됩니다 . ECMAScript 표준 섹션 11.1.6을 참조하십시오 .

  2. 두 번째 스 니펫에서 함수는 할당 연산자의 오른쪽 부분에 있기 때문에 표현식으로 해석됩니다 =.

  3. 세 번째 스 니펫에는 인터프리터가 함수를 표현식으로 읽을 수 있도록 허용하는 것이 없으므로 식별자 없이는 유효하지 않은 선언으로 간주됩니다 (Gecko는 통과 할 수 있지만 다음 ()그룹화 연산자 에 질식 합니다. ) 적용되지 않음).


처음 두 경우는 함수 표현식 을 표시하며 ( 1+1또는 x*f(4)) 와 같은 표현식이 나타날 수있는 모든 위치에 나타날 수 있습니다 . 1+1,가로 평가되는 방식과 마찬가지로 2이러한 식은 해당 함수로 평가됩니다.


세 번째 경우는 함수 선언문 이며 다른 명령문 (예 : if또는 while명령문)을 가질 수있는 모든 위치에 나타날 수 있습니다 .

Funcion 선언문을 통해 익명 함수를 선언하는 것은 별 의미가 없습니다. 그렇지 않으면 아무도 나중에 함수에 대한 참조를 얻지 못하기 때문입니다.


당신은 개방해야 할 이유 (또는 var x =처음 두 경우처럼은 표현의 맥락에서 해석 될 다음 비트를 강제하는 것입니다. ( var x = if ...예를 들어 어떻게 할 수 없는지 생각해보십시오 ). function첫 번째로 넣으면 원하지 않는 선언문 으로 구문 분석됩니다 .


처음 두 개는 함수 표현식이라는 것입니다. 즉, JS 코드가 실행될 때 인라인되고 해석됩니다.

세 번째는 함수 선언이며 코드가 컴파일 될 때 해석됩니다. 컴파일시 해석되므로 주변의 다른 코드가 아직 실행되지 않았기 때문에 즉시 실행할 수 없습니다.

예를 표시하려면 :

// foo == undefined
// bar == function

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

// foo == function
// bar == function

간단히 말해, function앞에 아무것도없는 단어가있을 때마다 선언입니다. 어떤 것이 앞에 올 때마다 그것은 표현입니다.


생각하는 간단한 방법은 다음과 같습니다. If functionis the first keyword on the line, 파서는 나머지 줄을 함수 선언으로 해석합니다. 즉, 함수의 이름을 지정하는 것을 잊은 것처럼 다음과 같이 작성하려고한다고 생각할 것입니다.

function foo(){ 
    // code
}

이 문제를 해결하는 방법은 전체 함수를 일부 괄호 안에 감싸거나 변수 할당의 일부로 만드는 것입니다. 두 경우 모두, 당신은 function줄에 더 다시 넣고 파서가 당신이 함수 선언을 작성하고 있지 않다는 것을 인식하도록 허용합니다.

function줄의 시작 부분에 나타나고 여전히 함수 표현식과 함수 선언을 구분하는 것이 나에게 사소한 것처럼 보이지만 JavaScript가 처음 디자인되었을 때 그렇게 사소한 것은 아니었다 고 생각합니다.


익명 함수는 스택 오버플로 질문에 잘 설명 되어 있습니다. 같은 줄에서 익명 함수를 호출해야하는 이유는 무엇입니까? .

참고 URL : https://stackoverflow.com/questions/6719089/javascript-anonymous-function-immediate-invocation-execution-expression-vs-dec

반응형