가방 을 닫 고 상세 하 게 해석 하 다.

5447 단어 js폐쇄 하 다


1. 가방 닫 기
폐쇄 (closure) 는 함수 식 프로 그래 밍 의 개념 으로 1960 년대 에 나 타 났 으 며, 최초 로 폐쇄 를 실현 한 언어 는 Scheme 이 며, LISP 의 방언 이다.이후 폐쇄 적 특성 은 다른 언어 로 널리 받 아들 여 졌 다.패 킷 의 엄격 한 정 의 는 '함수 (환경) 와 그 폐쇄 적 인 자유 변수 로 구 성 된 집합체' 입 니 다. 이 정 의 는 여러분 에 게 어 려 운 정의 입 니 다. 그래서 우 리 는 먼저 예 와 그렇게 엄격 하지 않 은 해석 을 통 해 패 킷 이 무엇 인지 설명 합 니 다.
Scheme 입 니 다. LISP 의 사투리 입 니 다.이후 폐쇄 적 특성 은 다른 언어 로 널리 받 아들 여 졌 다.패 킷 의 엄격 한 정 의 는 '함수 (환경) 와 그 폐쇄 적 인 자유 변수 로 구 성 된 집합체' 입 니 다. 이 정 의 는 여러분 에 게 어 려 운 정의 입 니 다. 그래서 우 리 는 먼저 예 와 그렇게 엄격 하지 않 은 해석 을 통 해 패 킷 이 무엇 인지 설명 합 니 다.
그리고 예 를 들 어 폐쇄 적 인 전형 적 인 용 도 를 설명 한다.
1.1 폐쇄 란 무엇 인가
쉽게 말 하면 자 바스 크 립 트 의 모든 함 수 는 하나의 패키지 이지 만 일반적인 의미 에 포 함 된 함 수 는 패키지 의 특성 을 더욱 나 타 낼 수 있 습 니 다. 아래 의 예 를 보십시오.
var generateClosure = function() {
var count = 0;
var get = function() {
count ++;
return count;
};
return get;
};
var counter = generateClosure();
console.log(counter()); //    1
console.log(counter()); //    2
console.log(counter()); //    3

이 코드 에서 generateClosure () 함수 에는 부분 변수 count 가 있 고 초기 값 은 0 입 니 다.get 이라는 함수 도 있 습 니 다. get 은 부모 역할 도 메 인, 즉 generateClosure () 함수 의 count 변 수 를 1 증가 시 키 고 count 의 값 을 되 돌려 줍 니 다.generateClosure () 의 반환 값 은 get 함수 입 니 다.외부 에서 우 리 는 counter 변 수 를 통 해 generateClosure () 함 수 를 호출 하고 그 반환 값, 즉 get 함 수 를 얻 었 습 니 다. 그 다음 에 counter () 를 몇 번 반복 해서 호출 했 습 니 다. 우 리 는 매번 돌아 오 는 값 이 1 씩 증가 하 는 것 을 발 견 했 습 니 다.위의 예 가 어떤 특징 을 가지 고 있 는 지 살 펴 보 겠 습 니 다. 일반적인 명령 식 프로 그래 밍 사고방식 에 따라 count 는 generateClosure 함수 내부 의 변수 입 니 다. 그의 생명 주 기 는 generateClosure 가 호출 된 시기 입 니 다. generateClosure 가 호출 스 택 에서 돌아 올 때 count 변 량 이 신청 한 공간 도 방출 됩 니 다.문제.
예, generateClosure () 호출 이 끝 난 후에 counter () 는 '이미 방출 된' count 변 수 를 인 용 했 고 오류 가 없 을 뿐만 아니 라 오히려 counter () 를 호출 할 때마다 count 를 수정 하고 되 돌려 주 었 습 니 다.이게 어떻게 된 거 죠?이른바 폐쇄 적 인 특성 이다.한 함수 가 내부 에서 정 의 된 함 수 를 되 돌려 줄 때 하나의 패 킷 이 생 겼 습 니 다. 패 킷 은 되 돌아 오 는 함수 뿐만 아니 라 이 함수 의 정의 환경 도 포함 합 니 다.위의 예 에서 함수 generateClosure () 의 내부 함수 get 이 외부 변수 conter 에 의 해 인용 되 었 을 때 conter 와 generateClosure () 의 부분 변 수 는 폐쇄 적 인 것 입 니 다.만약 아직 명확 하지 않다 면, 아래 의 이 예 는 도움 이 될 것 이다.
이해 해.
var generateClosure = function() {
var count = 0;
var get = function() {
count ++;
return count;
};
return get;
};
var counter1 = generateClosure();
var counter2 = generateClosure();
console.log(counter1()); //    1
console.log(counter2()); //    1
console.log(counter1()); //    2
console.log(counter1()); //    3
console.log(counter2()); //    2

위의 이 예 는 패 킷 이 어떻게 생 겼 는 지 설명 한다. conter 1 과 conter 2 는 각각 generateClosure () 함 수 를 호출 하여 두 개의 패 킷 을 닫 는 인 스 턴 스 를 생 성 했다. 그들 내부 에서 인용 한 count 변 수 는 각각 각자 의 운행 환경 에 속한다.generateClosure () 가 get 함 수 를 되 돌려 줄 때 개인 적 으로 get 이 인용 할 수 있 는 generateClosure () 함수 의 내부 변수 (즉 count 변수) 도 되 돌려 주 고 메모리 에 복사 본 을 생 성 한 다음 generateClosure () 가 되 돌아 오 는 함수 의 두 인 스 턴 스 conter 1 과 conter 2 는 서로 독립 된 것 으로 이해 할 수 있 습 니 다.
1.2 패키지 의 용도 1. 패키지 의 리 셋 함수 패 키 지 는 두 가지 주요 용도 가 있 는데 하 나 는 패키지 의 리 셋 함 수 를 실현 하 는 것 이 고 다른 하 나 는 대상 의 디 테 일 을 숨 기 는 것 이다.우리 먼저 아래 의 이 코드 예 시 를 보고, 끼 워 넣 은 리 셋 함 수 를 이해 합 시다.다음 코드 는 Node. js 에서 MongoDB 를 사용 하여 사용자 의 기능 을 간단하게 추가 하 는 것 입 니 다.
exports.add_user = function(user_info, callback) {
var uid = parseInt(user_info['uid']);
mongodb.open(function(err, db) {
if (err) {callback(err); return;}
db.collection('users', function(err, collection) {
if (err) {callback(err); return;}
collection.ensureIndex("uid", function(err) {
if (err) {callback(err); return;}
collection.ensureIndex("username", function(err) {
if (err) {callback(err); return;}
collection.findOne({uid: uid}, function(err) {
if (err) {callback(err); return;}
if (doc) {
callback('occupied');
} else {
var user = {
uid: uid,
user: user_info,
};
collection.insert(user, function(err) {
callback(err);
});
}
});
});
});
});
});
};

Node. js 나 MongoDB 에 익숙 하지 않 으 면 괜 찮 습 니 다. 디 테 일 을 이해 할 필요 가 없습니다. 대략적인 논 리 를 잘 보면 됩 니 다.이 코드 에 서 는 패 키 지 를 닫 는 레이 어 링 을 사 용 했 는데, 각 층 의 패 키 지 는 모두 반전 함수 이다.리 셋 함 수 는 즉시 실행 되 지 않 고 해당 요청 이 처 리 된 후에 요청 한 함수 로 리 셋 됩 니 다.포 함 된 모든 층 에 콜 백 에 대한 인용 이 있 고 가장 안쪽 에는 외부 에서 정 의 된 uid 변 수 를 사용 하 는 것 을 볼 수 있 습 니 다.패 킷 메커니즘 이 존재 하기 때문에 외층 함수 가 이미 실행 되 었 더 라 도 그 역할 영역 에서 신청 한 변 수 는 방출 되 지 않 습 니 다. 내부 함수 가 이러한 변 수 를 인용 할 수 있 기 때문에 포 함 된 비동기 반전 을 완벽 하 게 실현 할 수 있 습 니 다.
2. 개인 구성원 을 실현 하 는 것 은 자 바스 크 립 트 의 대상 이 개인 속성 이 없다 는 것 을 알 고 있 습 니 다. 즉, 대상 의 모든 속성 이 외부 에 노출 된 것 입 니 다.이렇게 하면 안전 위험 이 있 을 수 있다. 예 를 들 어 대상 의 사용자 가 특정한 속성 을 직접 수정 하여 대상 내부 데이터 의 일치 성 이 파괴 되 는 등 이다.JavaScript 는 모든 개인 속성 앞 에 밑줄 치기 (예: my PrivateProp) 를 약속 합 니 다.
이 속성 은 개인 적 인 것 임 을 나타 내 며 외부 대상 이 직접 읽 고 써 서 는 안 된다.그러나 이것 은 비공식적인 약속 일 뿐 대상 의 사용자 가 이렇게 하지 않 는 다 고 가정 하면 더욱 엄격 한 메커니즘 이 있 습 니까?답 은 있다. 폐쇄 를 통 해 이 루어 질 수 있다.앞의 그 예 를 다시 봅 시다.
var generateClosure = function() {
var count = 0;
var get = function() {
count ++;
return count;
};
return get;
};
var counter = generateClosure();
console.log(counter()); //    1
console.log(counter()); //    2
console.log(counter()); //    3

counter () 를 호출 해야만 패키지 내의 count 변수 에 접근 할 수 있 고 규칙 에 따라 1 을 추가 할 수 있 으 며, 그 외 에는 count 변 수 를 다른 방식 으로 찾 을 수 없습니다.이 간단 한 사례 의 깨 우 침 을 받 아 우 리 는 한 대상 을 패키지 로 포장 하고 '방문 기' 의 대상 만 되 돌려 주면 세부 사항 을 숨 길 수 있다.자 바스 크 립 트 대상 의 개인 구성원 실현 에 대한 더 많은 정 보 는 참고 하 시기 바 랍 니 다.http://javascript.crockford.com/private.html。

좋은 웹페이지 즐겨찾기