>웹 프론트엔드 >JS 튜토리얼 >JavaScript 클로저 구문 분석(코드 포함)

JavaScript 클로저 구문 분석(코드 포함)

不言
不言앞으로
2019-03-05 14:09:411930검색

이 글의 내용은 JavaScript 클로저(코드 포함) 분석에 대한 내용입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

클로저는 다른 함수 범위에 있는 변수에 액세스할 수 있는 함수입니다. 클로저를 생성하는 일반적인 방법은 다른 함수 내에 함수를 생성하는 것입니다. 클로저를 이해하기 전에 먼저 변수 범위를 이해해야 합니다

변수 범위: 전역 변수와 지역 변수
1. 전역 변수
전역 범위에서 직접 정의된 변수

var name='Fakin';
function getName(){
  alert(name)
}
getName()//'Fakin'

그리고 함수는 전역 변수를 직접 읽을 수 있습니다

2 . 지역 변수
함수 내부에 직접 정의된 변수(JS는 ES6 이전에는 블록 수준 범위가 없었습니다.)

function getName(){
  var name='Fakin';
}
alert(name)//undefined

Closure
이 두 가지를 명확히 한 후 클로저를 살펴보겠습니다. 무슨 일이 일어나고 있나요?

질문 1: 클로저란 무엇인가요? 위에서 언급한 내용이 많은데 이해가 안 되나요?
답: 개인적으로 클로저에 대한 이해는 다른 함수의 내부 변수를 읽을 수 있는 함수입니다

질문 2: 클로저 사용 방법
답: 함수 내부에 함수를 만들고, 이 함수에서 이전 함수의 변수를 참조합니다. . 마지막으로 이 함수가 어떻게 반환되는지 이야기해 보겠습니다. 예를 들어보겠습니다.

function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000

위의 예에서 f2는 f1에 할당됩니다. 결과는 총 두 번 실행됩니다. 결과 우리는 또한 원하는 것을 얻었습니다. 이는 클로저에서 f2가 f1의 변수 'n'을 참조하지만 f1이 실행된 후 메모리에서 'n'이 삭제되지 않음을 증명합니다. .JS에서는 함수가 실행된 후 변수가 다른 곳에서 참조되지 않으면 자동으로 삭제된다는 점을 누구나 알아야 합니다.

클로저 사용 시 주의 사항

1: 클로저를 사용하면 함수의 변수가 메모리에 저장되므로 메모리 사용량이 많아져 렌더링이 정지되는 등의 현상이 발생하고 브라우저가 실행됩니다. IE 브라우저에서도 메모리 누수 및 기타 문제가 발생할 수 있습니다
2: 하위 함수는 클로저에서 상위 함수의 변수를 참조하므로 하위 함수는 상위 함수 변수를 수정하지 마세요. ​부모 함수 변수를 마음대로

생각해보기

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push(function () {
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
f1(); // 16
f2(); // 16
f3(); // 16

왜 f1 f2 f3은 모두 우리가 원하는 값이 아닌 동일한 값을 반환합니까? 그렇다면 폐쇄로 어떻게 해결할 수 없습니까?
실제로는 매우 간단합니다. 클로저를 위해 두 줄의 코드만 더 있으면 됩니다

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
       //在自执行函数中把i传入相当于这个自执行函数的参数绑定了i,
       //当每次循环的时候不管变量怎么更改,这个函数的参数不会更改,所以返回咱们想要的结果
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 1
f2(); // 4
f3(); // 9

위 내용은 JavaScript 클로저 구문 분석(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제