가능한 중복 :
javascript function vs. (function() { … }());기본 자바 스크립트 :()();
이 너무 기본적인 경우 죄송하지만,이 구조는 무엇을해야합니까?
(function MyFunction() {
/* Some codes ... */
})();
어쩌면 특별한 용어가 있을까요? 검색 필드에 스 니펫을 넣는 대신 인터넷 검색에 유용 할 수 있습니다.
가능한 중복 :
javascript function vs. (function() { … }());기본 자바 스크립트 :()();
이 너무 기본적인 경우 죄송하지만,이 구조는 무엇을해야합니까?
(function MyFunction() {
/* Some codes ... */
})();
어쩌면 특별한 용어가 있을까요? 검색 필드에 스 니펫을 넣는 대신 인터넷 검색에 유용 할 수 있습니다.
직접 호출 패턴이라고합니다. 그것은 익명의 함수를 정의한 다음 즉시 실행합니다. 이것은 '개인 변수'등에 유용합니다. 당신이 일반적으로이 작업을 수행하려는 경우 :
는// 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으로 무한대를 전달하는 경우를 제외하고 중단하는 것은 매우 어렵습니다, 당신은 완전히 말도 안되는 방법으로 사용할 경우에도 마찬가지입니다.
은 ...
은 내가 명확한 설명이나 좋은, 실제 예제를 제공 거라고 말 했는가? 내가하지 않았 으면 좋겠다
올바르게 이해하면 익명의 함수가 즉시 실행됩니다. 그러나 반환 값, 즉'data'를 어떻게 얻을 수 있습니까? 다른 변수에 할당 할 수 있습니까? – moey
함수의 외부에서'data'를 액세스 할 수 없습니다. 그 함수에 대해 private 인 변수이기 때문입니다. 그러나 함수는 함수 *의 모든 변수에 액세스 할 수 있으므로'getData '에서'data'를 사용할 수 있습니다. 아마도 어딘가에 더 나은 설명이있을 것입니다. 'function scoping javascript'에 대한 검색 쿼리가 트릭을 수행해야합니다.) –
'data'는 정의 된 함수 내에서 사용할 수 있습니다. 다른 함수 호출에서 인수로 전달할 수도 있습니다 그러한 이벤트가 발생하면 호출 될 이벤트에 바인딩 할 수 있습니다. – igorw
이것은 기본적으로 전역 네임 스페이스에 코드를 추가하지 않고 MyFunction()에서 코드를 호출합니다. MyFunction에 정의 된 변수는 전역에서도 사용할 수 없습니다.
이 구문은 재귀 논리가 숨겨진 코드 조각을 실행해야하는 필요성과 함께 대부분의 경우에 사용되었습니다. 특정 하위 하위 문서를 페이지로 탐색합니다.
함수를 정의한 직후에 함수가 호출됩니다.
function MyFunction() {
/* Some codes ... */
}
MyFunction();
그러나 전역 범위에서의 MyFunction에 액세스 할 수 없습니다가, 그 의미 - 당신은 (= 8 =>http://jsfiddle.net/DEn4e/ IE < 제외 ) 어디서든 대한 액세스가 없습니다 :
이는 것을 작동 따라서 전역 변수에 누수 변수가 발생하기 때문에 권장하지 않습니다.
그것은 자기 발사 익명 기능이다. 이 선언 외부의 MyFunction은 함수를 참조하지 않지만 내부에서는 MyFunction을 사용하여 자신을 다시 호출 할 수 있습니다. –
IE (lte 8)에서는 MyFunction이 전역 범위로 유출됩니다. [http://jsfiddle.net/DEn4e/](http://jsfiddle.net/DEn4e/) – abuduba