2014-09-02 2 views
1

다음 코드는 어떻게 작동합니까? 함수는 컴파일러가 아직 도달하지 않은 표현식에서 함수를 어떻게 호출 할 수 있습니까? 에 도달하기 전에 (function def(...)에 도달했습니다. 이 점에 대해 내가 잘못 생각한 곳은 어디인가? 고맙습니다.범용 모듈 정의 IIFE 패턴

var a = 2; 

(function IIFE(def){ 
def(window); 
})(function def(global){ 
var a = 3; 
console.log(a); // 3 
console.log(global.a); // 2 
}); 
+0

'def '함수에 도달하기 전에'def (window)'에 도달하지 않습니다. IIFE의 두 번째 괄호 집합 (함수를 둘러싸 지 않는 두 번째 집합)은 매개 변수입니다. 'def' 함수는'IIFE' 함수가 호출되기 전에'IIFE' 함수의 매개 변수로 파싱됩니다. 그래서'IIFE' 함수는 파싱되고 (호출되지 않음),'def' 함수 매개 변수는 파싱됩니다 (호출되지 않습니다),'def' 함수 매개 변수는'IIFE' 함수 (현재 호출되고 있습니다)에 전달되고' def (window)'문이 실행됩니다 ('def' 함수 호출). 적어도 그것이 어떻게 작동하는지에 대한 나의 이해입니다. – War10ck

+0

인수는 항상 * 먼저 평가되고 * 결과는 함수에 전달됩니다. 그래서 여기에서,'function def (global) {...}'는'def '를 통해 인수에 접근하는 함수에 전달되는 인수입니다. –

답변

0

"def(window) is reached before (function def(...)" . 이것은 사실이 아닙니다. defIIFE에 대한 인수이므로 def은 매개 변수로 window와 함께 실행되기 때문에 적절한 결과를 얻을 수 있습니다. 자바 스크립트에서는 특별한 것이 없습니다.

당신이 기능을 분리 할 경우 도움이 :

var a = 2; 

function def(global) { 
    var a = 3; 
    console.log(a); // 3 
    console.log(global.a); // 2 
}; 

function IIFE(def){ 
    def(window); 
} 

IIFE(def); 

http://jsbin.com/jomep/1/edit

0

이 코드는 내가 코딩 한 것보다 좀 더 자세한입니다. 즉, 익명으로 실행되고있는 경우에도 IIFE 함수의 이름이 지정됩니다. def 함수의 경우도 마찬가지입니다. 이름이 있더라도 익명으로 사용됩니다.

어쨌든, 귀하의 질문에 대답 : IIFE 함수는 자바 스크립트의 다른 함수처럼 생성됩니다. 그런 다음 Javascript에서 완벽하게 유효한 매개 변수로 즉시 실행됩니다. 매개 변수는 또 다른 함수입니다. 다른 언어와 마찬가지로 매개 변수는 함수 호출 사이트에서 평가됩니다. 그러나 JavaScript는 함수를 데이터로 처리합니다. 이 예에서는 호출 사이트에서 def 함수를 정의한 다음 IIFE 함수의 매개 변수 목록에 입력했습니다.

편집 : Moog's reformatted answer도 분명히 명확히하는 데 도움이됩니다.