2011-12-28 3 views
2

가능한 중복 :
javascript function vs. (function() { … }());기본 자바 스크립트 :()();

이 너무 기본적인 경우 죄송하지만,이 구조는 무엇을해야합니까?

(function MyFunction() { 
    /* Some codes ... */  
})(); 

어쩌면 특별한 용어가 있을까요? 검색 필드에 스 니펫을 넣는 대신 인터넷 검색에 유용 할 수 있습니다.

+2

그것은 자기 발사 익명 기능이다. 이 선언 외부의 MyFunction은 함수를 참조하지 않지만 내부에서는 MyFunction을 사용하여 자신을 다시 호출 할 수 있습니다. –

+0

IE (lte 8)에서는 MyFunction이 전역 범위로 유출됩니다. [http://jsfiddle.net/DEn4e/](http://jsfiddle.net/DEn4e/) – abuduba

답변

6

직접 호출 패턴이라고합니다. 그것은 익명의 함수를 정의한 다음 즉시 실행합니다. 이것은 '개인 변수'등에 유용합니다. 당신이 일반적으로이 작업을 수행하려는 경우 :

// global namespace 
var data = 'lol'; 
function getData() { 
    return data; 
} 

글로벌 네임 스페이스의 변수 데이터가있을 거라고 누군가가 웹에서 data = 123를 입력 한 경우이 스크립트를 깰 수 콘솔. 직접 호출 패턴을 사용하여이 작업을 수행 할 수 있습니다

// global namespace 
/*lotsofcodehere*/ 
(function MyFunction() { 
    // closure namespace 
    var data = 'lol'; 
    this.getData = function getData() { 
    return data; 
    } 
})(); 
// global again 

을이 경우 함수 GetData의 여전히 글로벌 네임 스페이스에 존재하지만 데이터는 폐쇄 공간 외부에서 액세스 할 수 없습니다.

또한이 패턴을 사용할 때 MyFunction이 전역 이름 공간에 존재하지 않음을 알 수 있습니다. 그것은 많은 작은 언어 규칙들 중 하나이기 때문에 기본적으로 함수 안에있는 이름으로 함수를 항상 사용할 수 있습니다. 다음과 같은 경우 :

// returns the amount of from--s needed to get to 0 :D 
// (yes, it returns it's input number :D) 
(function() { 
var i = 0, keep = false; 

this.countToZero = function(from) { 
    if(from === 0) { 
    keep = false; // don't keep i's contents on next invocation 
    return i; 
    } 
    if(!keep) i = 0; // reset i on first invocation 
    i++; 
    keep = true; 
    return countToZero(from - 1); 
} 
})(); 

완벽하게 작동하며 countToZero (5)는 5를 올바르게 반환합니다.하지만, 음영이 아닌 네임 스페이스에서 사용하는 것이 좋지 않습니다. 함수 내에서이 함수를 사용하면 countToZero를 해당 함수의 멤버 속성으로 정의하여 반환 값을 깨뜨립니다 (countToZero에 더 이상 액세스 할 수 없음). 이것은 현실적인 시나리오는 아니지만이 예제에서는 작동합니다. 대신 위의 코드, 우리는이를 사용합니다 :

/*code*/ 
this.countToZero = function countToZero(from) { 
    // countToZero will *always* exist here as a reference to this function! 
    /*code*/ 
    return countToZero(from); 
}; 

이 코드는 당신이 과정의 첫 번째 PARAM으로 무한대를 전달하는 경우를 제외하고 중단하는 것은 매우 어렵습니다, 당신은 완전히 말도 안되는 방법으로 사용할 경우에도 마찬가지입니다.

은 ...

은 내가 명확한 설명이나 좋은, 실제 예제를 제공 거라고 말 했는가? 내가하지 않았 으면 좋겠다

+1

올바르게 이해하면 익명의 함수가 즉시 실행됩니다. 그러나 반환 값, 즉'data'를 어떻게 얻을 수 있습니까? 다른 변수에 할당 할 수 있습니까? – moey

+1

함수의 외부에서'data'를 액세스 할 수 없습니다. 그 함수에 대해 private 인 변수이기 때문입니다. 그러나 함수는 함수 *의 모든 변수에 액세스 할 수 있으므로'getData '에서'data'를 사용할 수 있습니다. 아마도 어딘가에 더 나은 설명이있을 것입니다. 'function scoping javascript'에 대한 검색 쿼리가 트릭을 수행해야합니다.) –

+1

'data'는 정의 된 함수 내에서 사용할 수 있습니다. 다른 함수 호출에서 인수로 전달할 수도 있습니다 그러한 이벤트가 발생하면 호출 될 이벤트에 바인딩 할 수 있습니다. – igorw

4

전역 이름 공간에 배치하지 않고 MyFunction 함수를 만들고 실행합니다. 네임 스페이스 오염을 피할 수있는 좋은 방법입니다. 일단 실행되면 다시는 실행되지 않습니다. 실제로 아무데도 저장되지 않았기 때문입니다.

+1

내부에 배치 할 수 있습니까? 다른 기능? – moey

+0

예, 다른 함수 호출이 허용되는 위치에 배치 할 수 있습니다. –

+0

가장 확실하게 할 수 있습니다. – MahdeTo

1

자체 실행 기능입니다. 함수의 이름을 지정하거나 지정하지 않고 함수를 정의한 후 즉시 실행합니다.

+0

고마워요, 조쉬. 이름없이 * 어떻게 하시겠습니까? – moey

+1

@ Siku-Siku.Com'(function() {/*...*/})(); ' –

+0

+1 매우 빠른 답변을 보내 주셔서 감사합니다! – moey

2

이것은 기본적으로 전역 네임 스페이스에 코드를 추가하지 않고 MyFunction()에서 코드를 호출합니다. MyFunction에 정의 된 변수는 전역에서도 사용할 수 없습니다.

이 구문은 재귀 논리가 숨겨진 코드 조각을 실행해야하는 필요성과 함께 대부분의 경우에 사용되었습니다. 특정 하위 하위 문서를 페이지로 탐색합니다.

0

함수를 정의한 직후에 함수가 호출됩니다.

function MyFunction() { 
    /* Some codes ... */  
} 
MyFunction(); 

그러나 전역 범위에서의 MyFunction에 액세스 할 수 없습니다가, 그 의미 - 당신은 (= 8 =>http://jsfiddle.net/DEn4e/ IE < 제외 ) 어디서든 대한 액세스가 없습니다 :

이는 것을 작동 따라서 전역 변수에 누수 변수가 발생하기 때문에 권장하지 않습니다.

+1

예제에서 MyFunction이 호출을 넘어 액세스 할 수 있고 정상적으로 호출 될 수 있기 때문에 이것은 엄격하게 동일하지 않습니다. – MahdeTo

+1

** 사실이 아닙니다. ** 그것은 네임 스페이스에서 발생하는 전역 네임 스페이스에 저장되지 않습니다. –

+0

정말요? (즉, MyFunction()); (경고 함수()); – abuduba

관련 문제