2011-12-23 7 views
13

은 내가 본 적이 : 정확히 어떻게 function() {}()이 작동합니까?

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

즉시 익명 함수를 실행하기 위해 여러 장소에 사용된다. ! 실제로 기능을 실행하게 방법을 알고

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

사람 : 일반적으로, 그것은 대신에 사용되는?

+0

앞의 코드는 작동하지만 두 번째 형식은 반환하지 않는 반면 함수는 반환 한 값을 무효화합니다. – toddsundsted

+0

세미콜론으로 문장을 종료하는 대신 왜 이것을 사용합니까? 그것은 여전히 ​​한 문자입니다. – js1568

답변

38

무엇을! 당신이 ! 사용하는 경우, 함수가 단항 (논리) NOT 연산자의 하나의 값이된다

않습니다.

이렇게하면 함수가 표현식으로 평가되어 강제로 인라인 될 수 있습니다.


다른 대안

당신은 단지에 대한 연산자를 사용하여이 작업을 수행 할 수 있습니다. 다음은 몇 가지 예입니다 ...

좋은 점은 연산자의 의미가 과부하가 아니라는 점입니다.


당신이 기능의 주위에 () 사용하는 경우, 당신이 그들을 분리하는 세미콜론없이 당신이있는 경우 행에 하나 이상을 잘라 몇 가지 버그를 칠 수 ()

의 문제 .

(function() { 
    alert('first'); 
}()) 


(function() { 
    alert('second'); 
}()) 

// TypeError: undefined is not a function 

제 함수 주위 외측 () 한 쌍의 함수 호출하려는 것으로 해석되기 때문은 TypeError 될 것이다. 첫 번째 함수는 물론 함수를 반환하지 않으므로 undefined에 전화하려고합니다. 다른 연산자를 사용하는 대처 (또는 방지)하는 방법


문제

에도 어느 정도 오버로드 + 같은 연산자는 오류가 발생하지 않습니다.

이렇게하면 ...

+function() { 
    alert('first'); 
}() 

+function() { 
    alert('second'); 
}() 

+

는 단항 연산자 +로 해석하고,이 경우가 있으므로 NaN 변환 도착 undefined 첫 번째 함수에서 반환 된 결과를 변환한다.

+

는 또한 운영자로 해석되고, 그래서 여기에 다시 undefined 인 제 2 함수의 리턴 결과 NaN를 추가 할 것이다.

결과는 물론 NaN이지만 무해합니다. 오류를 발생시키는 불법 코드는 없습니다. 운영자가

이를 증명하기 위해 기능과 상호 작용하는 방법의


데모, 그냥 ... 각 다음, 반환 값을 기능을 콘솔에 붙여 줄

+function() { 
    alert('first'); 
    return "10"; 
}() 

+function() { 
    alert('second'); 
    return 20; 
}() 

// 30 

두 개의 alert이 표시되고 콘솔에 30이 표시됩니다. + 연산자가 Stri ng "10"10으로 변경하고 두 번째 +을 두 결과를 함께 추가합니다.

+1

새 사용자 이름 !!!!! –

+0

@AdamRackis : 그래, 나는 움찔했다. –

+0

환상적인 답변! 당신은 내 +1을가집니다. – Bojangles

2

!은 일반적인 논리적 부정입니다.
()이 기능을 실행합니다.

+5

나는 왜 OP가 단순히'!'를'function() {// code}()'(그렇지 않으면 에러) 앞에 붙이면 익명의 함수가 실행되는지를 묻고있다. – toddsundsted

관련 문제