2010-11-28 2 views
1

난 그냥 Immediately-Invoked Function ExpressionsBen Alman의 기사를 읽고 그가 (정말 아직 IIFEs 관련) 기능 식 및 클로저를 도입있어이 부분에 대해 궁금해 : 익명 함수 식을 호출하는 두 가지 구문이 다른 이유는 무엇입니까?

// ...doesn't it stand to reason that the function expression itself can 
// be invoked, just by putting() after it? 

function(){ /* code goes here */ }(); 

// This works! Well, almost. A minor JavaScript syntax issue actually 
// requires that ambiguity between function declarations and function 
// expressions be eliminated, which can be done by wrapping the function 
// expression in parens. 

// The following pattern is used universally to create an anonymous 
// closure with "privacy": 

(function(){ /* code goes here */ })(); 

// This parens syntax is also valid (I prefer the previous version): 

(function(){ /* code goes here */ }()); 

이 마지막 부분이 생각 난 것이다. 함수 표현식을 호출하는 두 가지 구문 버전이 왜 다른지 설명 할 수 있습니까?

이 구문은 익명 클로저를 호출하기 위해 의식적으로 도입 되었습니까? 아니면 다른 구문 속성의 부산물입니까?

왜 두 번째 버전이 작동합니까? 첫 번째는 파서 관점에서 나에게 의미가 있습니다. 첫 번째 괄호 쌍은 함수 객체로 평가되고 두 ​​번째 쌍은이 함수 객체를 호출합니다. 하지만 두 번째? 언급 한 구문상의 모호성을 해결하는 것처럼 보이지 않습니다.

아무에게도 내가 누락 된 부분을 말해 줄 수 있습니까?

답변

3

JavaScript에는 표현식과 구문문의 두 구문 분석 컨텍스트가 있기 때문에 모든 문제가 발생합니다. 문 수준에서 function foo() {}을 작성하면 해당 범위에 함수 foo이 정의되는 반면 표현식 수준에서는 function foo() {}이 새로운 익명 함수 (즉, foo으로 재귀 적으로 호출 할 수 있음)로 평가됩니다.

그래서 구문이 발생할 때마다 구문 분석기는 표현식 또는 문 수준 중 하나를 결정해야합니다. 기본적으로, 다른 것으로 확신하지 않는 한, 명령. 레벨에 있다고 가정합니다. 괄호는 "이것은 표현식이"이라고하는 구문 방식입니다.

따라서 (function() {})을 쓰면 파서가 함수를 표현식으로 처리합니다. 표현식에는 다른 표현식 (명령문 없음) 만 포함될 수 있기 때문에 (something-that-contains function(){} and-other-stuff)을 쓰면 그 안에있는 함수는 계속 표현식으로 처리됩니다.

+0

우수 답변. 내가 찾고 있었던 것 (그러나 나 자신을 생각할 수 없었다). :) 감사! –

1

괄호 안의 표현식은 함수 선언으로 해석 될 수 없기 때문에 두 번째 표현식이 작동합니다 (함수 식이어야하므로 원래 첫 번째 표현식의 모호성 문제를 해결해야 함).

관련 문제