2013-08-21 3 views
2

Javascript 자체 실행 기능이 컴파일 된 프로그램처럼 작동합니까? 즉, 자체 실행 함수 내에서 명명 된 익명 함수 뒤에 함수를 선언하고 명명 된 익명 함수로 런타임에 다른 함수를 찾을 수 있습니까? 나는 왜 다음과 같은 일을합니까?Javascript 자체 실행 기능이 컴파일 된 프로그램처럼 작동합니까?

명명 된 익명 함수는 런타임 중에 만 만들어 지므로 자체 실행 함수는 코드를 "컴파일하여"명명 된 익명 함수를 호출하는 함수에서 사용할 수 있도록 만들 수 없다고 생각했습니다.

(function(){ 
    var myFunc = function(){ 
     var bar = "Bar"; 
     return myFunc2() + bar; 
    } 

    function myFunc2(){ 
     return "Foo "; 
    } 

})() 

또는 myFunc가 호출되지 않기 때문에 myFunc2가 호출되지 않기 때문에 특정 예는 작동도

(function(){ 
    function myFunc(){ 
     var bar = "Bar"; 
     return myFunc2() + bar; 
    } 

    var myFunc2 = function(){ 
     return "Foo "; 
    } 

    window.fooBar = myFunc(); 

})() 

console.log(fooBar); 
+0

아니요. 특정 기능을 "찾을 수있는 기능"과 아무런 관련이 없습니다. 현재 범위의 익명이 아닌 함수는이 범위 내의 아무 곳에서나 찾을 수 있습니다. "익명으로 명명 된"함수는 나중에 정의 된 변수로 정의하기 때문에 "forward-located"될 수 없습니다. – devnull69

+2

미래의 질문을 위해 함수 용어를 고려할 수 있습니다. 자체 실행 기능은 일반적으로 익명 함수라고하는 _ [즉시 호출 된 함수 식 (IIFE)] (http://benalman.com/news/2010/11/immediately-invoked-function-expression/) _이라고합니다. _function expressions_이라고하고, 익명이 아닌 함수는 _function 선언입니다. – Andy

+0

@uws : 귀하의 진술과 논쟁 할 수 있습니다. 필자는 자체 실행 기능이 IIFE로 언급 된 것을 보았습니다. 그러나 이것은 정말로 잘못된 것입니다. 자체 실행 함수는 실제로 재귀이며 IIFE와는 아무런 관련이 없습니다. – sla55er

답변

2

. 하지만 일반적으로

는 JS 범위, 리프팅 및 타이밍에 대한 일반 규칙이 적용

변수가 채워 져야합니다 전에 사용 그것은 당신이 호출 할 때 사용하는 함수를 정의하기 전에.

+0

그 외에, 익명 함수 밖의'myFunc' 또는'myFunc2' 호출은 오류를 던집니다. – d4rkpr1nc3

+0

"변수는 호출 전에 사용할 변수를 정의하기 전에 사용하기 전에 채워야합니다." 정말 좋은 답변입니다. 감사합니다. – goonerify

0
(function(){ 
    var myFunc = function(){ 
     var bar = "Bar"; 
     return myFunc2() + bar; 
    } 

    function myFunc2(){ 
     return "Foo "; 
    } 

})() 

일부는이 becames ㅏ 후 :

(function(){ 
    var myFunc; 

    function myFunc2(){ 
     return myFunc2() + bar; 
    } 

    myFunc = function(){ 
     var bar = "Bar"; 
     return "Foo "; 
    } 
})() 

을 그리고 당신은 MYFUNC를 호출하면 실제로는 작동합니다(); myFunc2에서 반환 된 값을 로그하면 Foo Bar가 나타납니다.

명명 된 익명 함수 (실제로 함수 표현식 임)를 호출 할 때 var myFunc (= undefined); 게양된다. 그런 다음 과제는 같은 수준에 머물러 있습니다.

또한이 함수는 자체 실행 함수로 참조 할 수 없습니다 (자체 실행 함수는 실제로 재귀이기 때문에). 즉각적으로 함수 표현식이 호출됩니다.

@Quentin 나머지 부분은 다음과 같습니다. 변수는 호출 할 때 사용할 함수를 정의하기 전에 사용하기 전에 채워야합니다.

0

코드에서 실제로 일어나는 일을 볼 수 있습니다.

1. 변수 할당을 수행하는 함수가 있습니다. var myFunc =;

2. 함수를 선언하십시오. (하지만 아직 호출하지 않음)

3. myFunc를 window.foobar에 할당합니다.

4. 정의한 함수를 호출합니다.

이제 다음 단계는 일이 :

  1. MYFUNC이 값으로 기능을 가져옵니다.

  2. myFunc2가 정의됩니다.

  3. my.uncobar는 myFunc()를 호출 한 결과를 가져옵니다. 무슨 일이 일어나는지 myFunc() 은 myFunc2()을 호출 한 결과를 반환하고 그 결과를 bar에 추가합니다.

따라서, window.foobar의 값은 "foobar"입니다.

(아니요, 컴파일 된 프로그램 작동 방식이 아닙니다.)

관련 문제