웹 프론트엔드 JS 튜토리얼 JS 학습의 클로저에 대한 심층적인 이해

JS 학습의 클로저에 대한 심층적인 이해

Dec 06, 2016 am 11:21 AM
js

JS에서 클로저는 상대적으로 이해하기 어려운 부분입니다. 특히 프로그래밍 기초가 없는 사람들에게는 더욱 그렇습니다.

사실 클로저에 관해 주의할 점은 몇 가지밖에 없습니다. 모두 이해한다면 극복하는 것은 어렵지 않습니다. 클로저의 몇 가지 기본 원칙에 대해 이야기해 보겠습니다.

클로저의 개념

클로저는 생성된 함수에서 함수와 범위 객체의 조합입니다. (범위 개체에 대해서는 아래에서 설명합니다.)

좀 더 간단히 말하면 "하나 이상의 함수가 함수에 중첩되어 있는 한 이를 클로저라고 부를 수 있습니다.

function A() {
 var i = 5;
 return function() {
  console.log('i = '+i);
 }
}
 
var a = A();
a(); // i = 5
로그인 후 복사

클로저의 원리

1. 클로저 함수에 의해 외부 함수의 로컬 변수가 호출되는 경우 외부 함수 실행이 완료된 후 즉시 재활용됩니다.

우리는 언어에 관계없이 운영 체제에는 초과 할당 공간을 재활용하여 메모리를 줄이는 가비지 수집 메커니즘이 있다는 것을 알고 있습니다. 함수 호출이 완료되면 함수 내부의 지역 변수가 재활용 메커니즘에 의해 재활용됩니다.

위의 예를 예로 들어보겠습니다. 외부 함수 A가 호출되면 A의 지역 변수 i는 운영 체제에 의해 재활용되며 클로저를 사용하면 존재하지 않습니다. 결과는 더 이상 그렇지 않으며 재활용되지 않습니다. 상상해 보세요. i가 재활용되면 반환된 함수가 정의되지 않은 것으로 인쇄되지 않을까요?

나는 왜 재활용되지 않았나요?

JavaScript가 함수를 실행할 때 범위 객체를 생성하고 함수에 지역 변수를 저장하며(함수의 형식 매개변수도 지역 변수임) 함수에 전달된 변수와 함께 초기화됩니다. .

따라서 A가 호출되면 범위 개체가 생성되고 이를 Aa라고 부르겠습니다. 그러면 이 Aa는 다음과 같아야 합니다. Aa { i: 5 }; A 함수가 함수를 반환한 후 A가 실행됩니다. . Aa 객체는 재활용되어야 하지만 반환된 함수가 Aa의 i 특성을 사용하기 때문에 반환된 함수는 Aa에 대한 참조를 저장하므로 Aa는 재활용되지 않습니다.

그러므로 범위 객체를 이해하면 클로저를 만났을 때 함수 호출이 완료될 때 함수의 지역 변수가 즉시 재활용되지 않는 이유를 이해할 수 있습니다.

또 다른 예:

function A(age) {
 var name = 'wind';
 var sayHello = function() {
  console.log('hello, '+name+', you are '+age+' years old!');
 };
 return sayHello;
}
var wind = A(20);
wind(); // hello, wind, you are 20 years old!
로그인 후 복사

스코프 객체 Ww가 무엇인지 알 수 있나요?

Ww{ age: 'wind' };

2. 외부 함수가 호출될 때마다 이전 클로저가 여전히 존재하며 독립적입니다. 서로의 영향.

3. 동일한 클로저는 마지막 상태를 유지하며, 다시 호출되면 마지막 상태를 기준으로 합니다.

외부 함수가 호출될 때마다 생성되는 범위 개체가 다르다고 생각하면 됩니다. 위의 예에서는 전달하는 매개변수 age가 매번 다르기 때문에 생성되는 개체도 다릅니다. 매번.

외부 함수가 호출될 때마다 새로운 범위 개체가 생성됩니다.

function A() {
 var num = 42;
 return function() { console.log(num++); }
}
var a = A();
a(); // 42
a(); // 43
 
var b = A(); // 重新调用A(),形成新闭包
b(); // 42
로그인 후 복사

이 코드를 사용하면 두 가지를 발견할 수 있습니다. 먼저 a()를 두 번 호출하면 num이 자동으로 변경됩니다. 원래 값을 추가합니다. 이는 동일한 클로저가 마지막 상태를 유지하며 다시 호출될 때 마지막 상태를 기반으로 한다는 것을 의미합니다. 2. b()의 결과는 42이며 이는 새로운 클로저이며 다른 클로저의 영향을 받지 않음을 나타냅니다.

이렇게 생각하면 마치 비눗방울을 불 때마다(외부 함수 호출) 새로운 비눗방울(마개)이 생성될 수 있습니다. 동시에 두 개의 비누 방울은 서로 영향을 미치지 않습니다.

4. 외부 함수에 존재하는 여러 함수 "살고 죽는다"

다음 세 함수는 동시에 선언되며 모두 속성(지역 변수)에 대한 작업을 수행할 수 있습니다. 범위 개체 액세스 및 작업.

var fun1, fun2, fun3;
function A() {
 var num = 42;
 fun1 = function() { console.log(num); }
 fun2 = function() { num++; }
 fun3 = function() { num--; }
}
 
A();
fun1();  // 42
fun2();
fun2();
fun1();  // 44
fun3();
fun1();  //43
 
var old = fun1;
 
A();
fun1();  // 42
old();  // 43  上一个闭包的fun1()
로그인 후 복사

함수는 여러 개의 반환값을 가질 수 없기 때문에 전역 변수를 사용했습니다. A()를 두 번째 호출할 때 새로운 클로저가 생성되는 것을 다시 볼 수 있습니다.

클로저가 루프 변수를 만날 때

클로저에 대해 이야기할 때 클로저가 루프 변수를 만날 때의 상황에 대해 이야기해야 합니다.

function buildArr(arr) {
  var result = [];
  for (var i = 0; i < arr.length; i++) {
    var item = &#39;item&#39; + i;
    result.push( function() {console.log(item + &#39; &#39; + arr[i])} );
  }
  return result;
}
 
var fnlist = buildArr([1,2,3]);
fnlist[0](); // item2 undefined
fnlist[1](); // item2 undefined
fnlist[2](); // item2 undefined
로그인 후 복사

어떻게 이런 일이 일어날 수 있을까요? 우리가 구상하는 세 가지 출력은 item0 1, item1 2, item2 3이어야 합니다. 반환된 결과 배열에 정의되지 않은 item2가 세 개 저장되어 있는 이유는 무엇입니까?

클로저가 루프 변수를 만나면 루프가 끝난 후 변수 값이 균일하게 저장되는 것으로 나타났습니다. 위의 예를 보면 i가 루프 변수이고 루프가 끝나면 i가 됩니다. i++ 이후 3. Arr[3]에는 값이 없으므로 정의되지 않습니다. 어떤 사람들은 다음과 같이 궁금해할 수 있습니다. item2의 값은 왜 item3이어야 하지 않나요? 마지막 루프, 즉 i = 2일 때 item의 값은 item2이고, i++, i = 3일 때, 루프 조건이 충족되지 않고 이때의 item 값이 결정된다는 점에 유의하세요. 이므로 이때 arr[i]는 arr[3]이고 item은 item2입니다. 이것이 이해할 수 있습니까? 코드를 다음과 같이 변경하면 이해가 됩니다.

function buildArr(arr) {
  var result = [];
  for (var i = 0; i < arr.length; i++) {
    result.push( function() {console.log(&#39;item&#39; + i + &#39; &#39; + arr[i])} );
  }
  return result;
}
 
var fnlist = buildArr([1,2,3]);
fnlist[1](); // item3 undefined
로그인 후 복사

그렇다면 문제는 어떻게 수정해야 할까요? 코드를 살펴보겠습니다.

function buildArr(arr) {
  var result = [];
  for (var i = 0; i < arr.length; i++) {
    result.push( (function(n) {
      return function() {
       var item = &#39;item&#39; + n;
       console.log(item + &#39; &#39; + arr[n]);
      }
    })(i));
  }
  return result;
}
 
var fnlist = buildArr([1,2,3]);
fnlist[0](); // item0 1
fnlist[1](); // item1 2
fnlist[2](); // item2 3
로그인 후 복사

자체 실행 기능을 사용하여 i를 바인딩하면 i의 모든 상태가 저장되고 응답은 예상한 것과 동일하게 됩니다.

그래서 앞으로 클로저를 사용할 때 루프 변수를 만나면 이를 바인딩하기 위해 자체 실행 함수를 사용하는 것을 습관적으로 생각해야 합니다.

위 내용은 클로저에 대한 저의 이해입니다. 의견이나 제안 사항이 있으면 댓글 영역에서 더 많은 소통을 할 수 있기를 바랍니다. 서로 감사하고 격려해 주세요.


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

JS 및 Baidu Maps를 사용하여 지도 이동 기능을 구현하는 방법 JS 및 Baidu Maps를 사용하여 지도 이동 기능을 구현하는 방법 Nov 21, 2023 am 10:00 AM

JS 및 Baidu Map을 사용하여 지도 팬 기능을 구현하는 방법 Baidu Map은 지리 정보, 위치 지정 및 기타 기능을 표시하기 위해 웹 개발에 자주 사용되는 널리 사용되는 지도 서비스 플랫폼입니다. 이 글에서는 JS와 Baidu Map API를 사용하여 지도 이동 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 준비 바이두 맵 API를 사용하기 전에 먼저 바이두 맵 오픈 플랫폼(http://lbsyun.baidu.com/)에서 개발자 계정을 신청하고 애플리케이션을 만들어야 합니다. 생성 완료

주식 분석을 위한 필수 도구: PHP 및 JS를 사용하여 캔들 차트를 그리는 단계를 알아보세요. 주식 분석을 위한 필수 도구: PHP 및 JS를 사용하여 캔들 차트를 그리는 단계를 알아보세요. Dec 17, 2023 pm 06:55 PM

주식 분석을 위한 필수 도구: PHP 및 JS에서 캔들 차트를 그리는 단계를 배우십시오. 인터넷과 기술의 급속한 발전으로 주식 거래는 많은 투자자에게 중요한 방법 중 하나가 되었습니다. 주식분석은 투자자의 의사결정에 있어 중요한 부분이며 캔들차트는 기술적 분석에 널리 사용됩니다. PHP와 JS를 사용하여 캔들 차트를 그리는 방법을 배우면 투자자가 더 나은 결정을 내리는 데 도움이 되는 보다 직관적인 정보를 얻을 수 있습니다. 캔들스틱 차트는 주가를 캔들스틱 형태로 표시하는 기술 차트입니다. 주가를 보여주네요

권장 사항: 우수한 JS 오픈 소스 얼굴 감지 및 인식 프로젝트 권장 사항: 우수한 JS 오픈 소스 얼굴 감지 및 인식 프로젝트 Apr 03, 2024 am 11:55 AM

얼굴 검출 및 인식 기술은 이미 상대적으로 성숙하고 널리 사용되는 기술입니다. 현재 가장 널리 사용되는 인터넷 응용 언어는 JS입니다. 웹 프런트엔드에서 얼굴 감지 및 인식을 구현하는 것은 백엔드 얼굴 인식에 비해 장점과 단점이 있습니다. 장점에는 네트워크 상호 작용 및 실시간 인식이 줄어 사용자 대기 시간이 크게 단축되고 사용자 경험이 향상된다는 단점이 있습니다. 모델 크기에 따라 제한되고 정확도도 제한됩니다. js를 사용하여 웹에서 얼굴 인식을 구현하는 방법은 무엇입니까? 웹에서 얼굴 인식을 구현하려면 JavaScript, HTML, CSS, WebRTC 등 관련 프로그래밍 언어 및 기술에 익숙해야 합니다. 동시에 관련 컴퓨터 비전 및 인공지능 기술도 마스터해야 합니다. 웹 측면의 디자인으로 인해 주목할 가치가 있습니다.

PHP와 JS를 사용하여 주식 촛대 차트를 만드는 방법 PHP와 JS를 사용하여 주식 촛대 차트를 만드는 방법 Dec 17, 2023 am 08:08 AM

PHP와 JS를 사용하여 주식 캔들 차트를 만드는 방법 주식 캔들 차트는 주식 시장에서 흔히 사용되는 기술 분석 그래픽으로 시가, 종가, 최고가 등의 데이터를 그려서 투자자가 주식을 보다 직관적으로 이해할 수 있도록 도와줍니다. 주식의 최저 가격. 이 기사에서는 특정 코드 예제와 함께 PHP 및 JS를 사용하여 주식 캔들 차트를 만드는 방법을 설명합니다. 1. 준비 시작하기 전에 다음 환경을 준비해야 합니다. 1. PHP를 실행하는 서버 2. HTML5 및 Canvas를 지원하는 브라우저 3

PHP 및 JS 개발 팁: 주식 캔들 차트 그리기 방법 익히기 PHP 및 JS 개발 팁: 주식 캔들 차트 그리기 방법 익히기 Dec 18, 2023 pm 03:39 PM

인터넷 금융의 급속한 발전으로 인해 주식 투자는 점점 더 많은 사람들의 선택이 되었습니다. 주식 거래에서 캔들 차트는 주가의 변화 추세를 보여주고 투자자가 보다 정확한 결정을 내리는 데 도움이 되는 일반적으로 사용되는 기술적 분석 방법입니다. 이 기사에서는 PHP와 JS의 개발 기술을 소개하고 독자가 주식 캔들 차트를 그리는 방법을 이해하도록 유도하며 구체적인 코드 예제를 제공합니다. 1. 주식 캔들 차트의 이해 주식 캔들 차트를 그리는 방법을 소개하기 전에 먼저 캔들 차트가 무엇인지부터 이해해야 합니다. 캔들스틱 차트는 일본인이 개발했습니다.

JS 및 Baidu Maps를 사용하여 지도 다각형 그리기 기능을 구현하는 방법 JS 및 Baidu Maps를 사용하여 지도 다각형 그리기 기능을 구현하는 방법 Nov 21, 2023 am 10:53 AM

JS 및 Baidu Maps를 사용하여 지도 다각형 그리기 기능을 구현하는 방법 현대 웹 개발에서 지도 애플리케이션은 일반적인 기능 중 하나가 되었습니다. 지도에 다각형을 그리면 사용자가 보고 분석할 특정 영역을 표시하는 데 도움이 될 수 있습니다. 이 기사에서는 JS 및 Baidu Map API를 사용하여 지도 다각형 그리기 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저 Baidu Map API를 도입해야 합니다. 다음 코드를 사용하여 Baidu Map API의 JavaScript를 HTML 파일로 가져올 수 있습니다.

JS와 Baidu Map을 활용하여 지도 클릭 이벤트 처리 기능을 구현하는 방법 JS와 Baidu Map을 활용하여 지도 클릭 이벤트 처리 기능을 구현하는 방법 Nov 21, 2023 am 11:11 AM

JS 및 Baidu Maps를 사용하여 지도 클릭 이벤트 처리 기능을 구현하는 방법 개요: 웹 개발에서는 지리적 위치 및 지리적 정보를 표시하기 위해 지도 기능을 사용해야 하는 경우가 많습니다. 지도에서의 클릭 이벤트 처리는 지도 기능에서 일반적으로 사용되는 중요한 부분입니다. 이 글에서는 JS와 Baidu Map API를 사용하여 지도의 클릭 이벤트 처리 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 단계: Baidu Map API 파일 가져오기 먼저 다음 코드를 통해 Baidu Map API 파일을 가져올 수 있습니다.

JS 및 Baidu Maps를 사용하여 지도 히트맵 기능을 구현하는 방법 JS 및 Baidu Maps를 사용하여 지도 히트맵 기능을 구현하는 방법 Nov 21, 2023 am 09:33 AM

JS 및 Baidu Maps를 사용하여 지도 열 지도 기능을 구현하는 방법 소개: 인터넷과 모바일 장치의 급속한 발전으로 지도는 일반적인 응용 시나리오가 되었습니다. 시각적 표시 방법인 히트맵은 데이터 분포를 보다 직관적으로 이해하는 데 도움이 될 수 있습니다. 이 기사에서는 JS 및 Baidu Map API를 사용하여 지도 히트맵 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 준비 작업: 시작하기 전에 Baidu 개발자 계정, 애플리케이션 생성, 해당 AP 획득 등의 항목을 준비해야 합니다.

See all articles