웹 프론트엔드 JS 튜토리얼 JavaScript 익명 함수 및 closures_javascript 기술에 대한 자세한 토론

JavaScript 익명 함수 및 closures_javascript 기술에 대한 자세한 토론

May 16, 2016 pm 04:31 PM
javascript 익명 함수 폐쇄

1. 익명 기능
함수는 JavaScript에서 가장 유연한 개체입니다. 여기서는 익명 함수의 사용에 대해서만 설명합니다. 익명 함수: 함수 이름이 없는 함수입니다.

1.1 함수의 정의, 먼저 함수의 정의를 간략하게 소개합니다. 크게 세 가지로 나눌 수 있습니다

첫 번째 유형: 가장 일반적인 유형이기도 합니다

코드 복사 코드는 다음과 같습니다.

함수 double(x){
2 * x를 반환합니다.
}

두 번째 방법: 이 방법은 함수 생성자를 사용하고 매개변수 목록과 함수 본문을 모두 문자열로 처리하므로 매우 불편하므로 권장되지 않습니다.

코드 복사 코드는 다음과 같습니다.

var double = new Function('x', 'return 2 * x;');

세 번째 유형:

var double = function(x) { return 2* x }
"=" 오른쪽에 있는 함수는 익명 함수라는 점에 유의하세요. 함수를 생성한 후 해당 함수는 square 변수에 할당됩니다.

1.2 익명 함수 생성

첫 번째 방법은 위에서 언급한 것처럼 제곱함수를 정의하는 방법인데, 이 역시 가장 많이 사용되는 방법 중 하나입니다.

두 번째 방법:

코드 복사 코드는 다음과 같습니다.

(함수(x, y){
경고(xy)
})(2, 3);

여기서(첫 번째 대괄호 안에) 익명 함수가 생성되고, 두 번째 대괄호는 익명 함수를 호출하고 매개변수를 전달하는 데 사용됩니다.

2. 폐쇄
클로저를 뜻하는 영어 단어는 클로저(closure)인데, 이는 자바스크립트 지식의 매우 중요한 부분입니다. 왜냐하면 클로저를 사용하면 코드의 양을 크게 줄이고 코드를 더 명확하게 보이게 만드는 등의 작업을 할 수 있기 때문입니다. 한마디로 매우 강력합니다.

클로저의 의미: 직설적으로 말하면 클로저는 함수의 중첩입니다. 외부 함수가 실행되더라도 내부 함수는 외부 함수의 모든 변수를 사용할 수 있습니다(여기에는 JavaScript 범위 체인이 포함됩니다).

예시 1

코드 복사 코드는 다음과 같습니다.

함수 checkClosure(){
var str = '레인맨';
setTimeout(
           function(){ Alert(str) } //이것은 익명 함수입니다
, 2000);
}
checkClosure();

이 예제는 실행 프로세스를 주의 깊게 분석한 후에도 여전히 많은 지식 포인트가 있습니다. checkClosure 함수의 실행은 즉각적이며(아마도 0.00001밀리초만 소요될 수 있음) 변수 str이 함수 본문에 생성됩니다. checkClosure.의 경우 setTimeout의 익명 함수에 str에 대한 참조가 있으므로 checkClosure가 실행된 후에 str이 해제되지 않습니다. 2초 후 함수 본문의 익명 함수가 실행되고 str이 해제됩니다.

예제 2, 최적화된 코드

코드 복사 코드는 다음과 같습니다.

함수 forTimeout(x, y){
경고(xy);
}
함수 지연(x, y, 시간){
setTimeout('forTimeout(' x ',' y ')' , 시간)
}
/**
* 위의 지연 함수는 읽기도 어렵고 쓰기도 쉽지 않은데, 클로저를 사용하면 코드가 더 명확해집니다
* 함수 지연(x, y, 시간){
* setTimeout(
* 함수(){
* forTimeout(x, y)
*                                                                               *, 시간)
* }
​*/

3. 예시

익명 함수의 가장 큰 용도는 클로저(JavaScript 언어의 기능 중 하나)를 생성하는 것이며, 전역 변수의 사용을 줄이기 위해 네임스페이스를 구축할 수도 있습니다.

예 3:

코드 복사 코드는 다음과 같습니다.

var oEvent = {};
(함수(){
var addEvent = function(){ /*코드 구현 생략*/ };
함수 제거이벤트(){}

oEvent.addEvent = addEvent;
oEvent.removeEvent = 제거이벤트;
})();

이 코드에서 addEvent, RemoveEvent 함수는 로컬 변수이지만, 전역 변수 oEvent를 통해 사용할 수 있어 전역 변수의 사용이 대폭 줄어들고 웹 페이지의 보안이 강화됩니다. 우리는 다음 코드를 사용하고 싶습니다: oEvent.addEvent(document.getElementById('box') , 'click' , function(){});

예 4:

코드 복사 코드는 다음과 같습니다.

var rainman = (함수(x, y){
xy를 반환합니다.
})(2, 3);
/**
*는 다음과 같은 형식으로도 쓸 수 있습니다. 첫 번째 괄호는 읽기에만 도움이 되지만, 다음과 같은 형식은 권장되지 않습니다.
* var rainman = 함수(x, y){
* xy를 반환;
* }(2, 3);
​*/

여기에서는 변수 rainman을 만들고 익명 함수를 직접 호출하여 5로 초기화합니다. 이 작은 트릭은 때때로 매우 실용적입니다.

예 5:

코드 복사 코드는 다음과 같습니다.

var 외부 = null;
(함수(){
var one = 1;
함수 내부 (){
         하나 = 1;
경고(하나);
}
외부 = 내부;
})();
외부(); //2
외부(); //3
외부(); //4

이 코드의 변수 one은 (함수 내에서 정의되기 때문에) 지역 변수이므로 외부에서 접근할 수 없습니다. 하지만 여기서는 변수 1에 액세스할 수 있는 내부 함수를 만들었고 전역 변수 외부는 내부를 참조하므로 외부를 세 번 호출하면 증분 결과가 나타납니다.

4. 주목
4.1 클로저를 사용하면 내부 함수가 상위 함수의 변수를 참조할 수 있지만 변수는 최종 값입니다

예 6:

코드 복사 코드는 다음과 같습니다.

/**
 *
 *

     *    
  • 하나

  •  *    

  •  *    

  •  *    
  • 하나

  •  *

 */

var 목록 = document.getElementsByTagName('li');
for(var i = 0 , len = listed.length ; i < len ; i ){
목록[ i ].onmouseover = function(){
경고(i)
};
}

마우스를 각

해결책 1:

코드 복사 코드는 다음과 같습니다.

var 목록 = document.getElementsByTagName('li');
for(var i = 0 , len = listed.length ; i < len ; i ){
(함수(색인){
목록[index].onmouseover = function(){
경고(색인)
~ })(i);
}

해결책 2:

코드 복사 코드는 다음과 같습니다.

var 목록 = document.getElementsByTagName('li');
for(var i = 0, len = list.length; i Lists[ i ].$$index = i; //Dom 요소의 $$index 속성을 바인딩하여 아래 첨자를 기록합니다.
목록[ i ].onmouseover = function(){
경고(this.$$index)
};
}

해결책 3:

코드 복사 코드는 다음과 같습니다.

함수 eventListener(목록, 인덱스){
List.onmouseover = function(){
경고(색인);
};
}
var 목록 = document.getElementsByTagName('li');
for(var i = 0 , len = listed.length ; i < len ; i ){
EventListener(목록[ i ] , i);
}

4.2 메모리 누수

클로저를 사용하면 브라우저에서 메모리 누수가 발생할 수 있습니다. 심각한 경우 브라우저가 중단될 수 있습니다. 관심이 있는 경우 http://www.jb51.net/article/57404를 참조하세요. HTM

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C++ 람다 표현식에서 클로저의 의미는 무엇입니까? C++ 람다 표현식에서 클로저의 의미는 무엇입니까? Apr 17, 2024 pm 06:15 PM

C++에서 클로저는 외부 변수에 액세스할 수 있는 람다 식입니다. 클로저를 생성하려면 람다 표현식에서 외부 변수를 캡처하세요. 클로저는 재사용성, 정보 숨기기, 지연 평가와 같은 이점을 제공합니다. 이는 클로저가 외부 변수가 파괴되더라도 여전히 접근할 수 있는 이벤트 핸들러와 같은 실제 상황에서 유용합니다.

C++ 익명 함수의 사용법과 특징 C++ 익명 함수의 사용법과 특징 Apr 19, 2024 am 09:03 AM

람다 식이라고도 하는 익명 함수는 이름을 지정하지 않고 일회용으로 사용하거나 함수 포인터를 전달하는 데 사용되는 함수입니다. 기능에는 익명성, 일회용 사용, 폐쇄, 반환 유형 추론이 포함됩니다. 실제로는 정렬이나 기타 일회성 함수 호출에 자주 사용됩니다.

C++ 함수에서 클로저의 장점과 단점은 무엇입니까? C++ 함수에서 클로저의 장점과 단점은 무엇입니까? Apr 25, 2024 pm 01:33 PM

클로저는 외부 함수의 범위에 있는 변수에 액세스할 수 있는 중첩 함수입니다. 클로저의 장점에는 데이터 캡슐화, 상태 보존 및 유연성이 포함됩니다. 단점으로는 메모리 소비, 성능 영향, 디버깅 복잡성 등이 있습니다. 또한 클로저는 익명 함수를 생성하고 이를 콜백이나 인수로 다른 함수에 전달할 수 있습니다.

C++ 람다 표현식에서 클로저를 구현하는 방법은 무엇입니까? C++ 람다 표현식에서 클로저를 구현하는 방법은 무엇입니까? Jun 01, 2024 pm 05:50 PM

C++ Lambda 표현식은 함수 범위 변수를 저장하고 함수에 액세스할 수 있도록 하는 클로저를 지원합니다. 구문은 [캡처 목록](매개변수)->return-type{function-body}입니다. 캡처 목록은 캡처할 변수를 정의합니다. [=]를 사용하여 모든 지역 변수를 값으로 캡처하고, [&]를 사용하여 모든 지역 변수를 참조로 캡처하거나, [변수1, 변수2,...]를 사용하여 특정 변수를 캡처할 수 있습니다. 람다 표현식은 캡처된 변수에만 액세스할 수 있지만 원래 값을 수정할 수는 없습니다.

함수 포인터와 클로저가 Golang 성능에 미치는 영향 함수 포인터와 클로저가 Golang 성능에 미치는 영향 Apr 15, 2024 am 10:36 AM

함수 포인터와 클로저가 Go 성능에 미치는 영향은 다음과 같습니다. 함수 포인터: 직접 호출보다 약간 느리지만 가독성과 재사용성이 향상됩니다. 클로저: 일반적으로 느리지만 데이터와 동작을 캡슐화합니다. 실제 사례: 함수 포인터는 정렬 알고리즘을 최적화할 수 있고 클로저는 이벤트 핸들러를 생성할 수 있지만 성능 저하를 가져옵니다.

Java에서는 클로저가 어떻게 구현됩니까? Java에서는 클로저가 어떻게 구현됩니까? May 03, 2024 pm 12:48 PM

Java의 클로저를 사용하면 외부 함수가 종료된 경우에도 내부 함수가 외부 범위 변수에 액세스할 수 있습니다. 익명의 내부 클래스를 통해 구현된 내부 클래스는 외부 클래스에 대한 참조를 보유하고 외부 변수를 활성 상태로 유지합니다. 클로저는 코드 유연성을 높이지만 익명 내부 클래스에 의한 외부 변수 참조는 해당 변수를 활성 상태로 유지하므로 메모리 누수의 위험을 인지해야 합니다.

PHP 함수의 연쇄 호출 및 폐쇄 PHP 함수의 연쇄 호출 및 폐쇄 Apr 13, 2024 am 11:18 AM

예, 체인 호출 및 클로저를 통해 코드 단순성과 가독성을 최적화할 수 있습니다. 체인 호출은 함수 호출을 유창한 인터페이스에 연결합니다. 클로저는 재사용 가능한 코드 블록을 생성하고 함수 외부의 변수에 액세스합니다.

Golang 익명 함수는 여러 값을 반환할 수 있나요? Golang 익명 함수는 여러 값을 반환할 수 있나요? Apr 13, 2024 pm 04:09 PM

예, Go 언어의 익명 함수는 여러 값을 반환할 수 있습니다. 구문: func(arg1,arg2,...,argN)(ret1,ret2,...,retM){//함수 본문}. 사용법: 반환 값을 받으려면 := 연산자를 사용하고, 여러 값을 반환하려면 return 키워드를 사용하세요.

See all articles