[전단 엔지니어 매 뉴 얼] JavaScript 의 폐쇄
function foo() {
var a = 2;
function bar() {
console.log( a );
}
return bar;
}
var baz = foo();
baz(); // 2
상식 적 으로 foo 함 수 는 실행 이 끝 난 후에 내부 변 수 를 없 앨 수 있 습 니 다. 그러나 bar 함수 내 부 는 a 에 대한 인용 을 유지 하고 있 기 때문에 foo () 를 호출 하여 bar 의 인용 을 baz 에 부 여 했 습 니 다. baz () 를 실행 하면 a 를 인쇄 할 수 있 습 니 다.이 밤 에는 함수 bar 와 변수 a 에 대한 인용 이 닫 혀 있 습 니 다.
폐쇄 및 역할 영역
폐쇄 와 작용 역 의 관계 에 대해 나의 이 해 는 폐쇄 가 사실은 작용 역 의 연장 이라는 것 이다.자바 스 크 립 트 에서 함수 내부 에서 함수 외부의 변 수 를 사용 할 수 있 기 때문에 모든 것 은 자신 도 모 르 게 패 킷 이 생 길 수 있 습 니 다. 만약 에 위의 코드 세 션 에서 함수 내부 에서 함수 외부의 변 수 를 사용 하 는 것 을 허락 하지 않 는 다 면 패 킷 을 닫 는 것 도 말 할 수 없습니다.
가방 을 닫 으 면 무슨 소 용이 있 습 니까?
개인 변수 와 개인 방법 을 모 의 합 니 다.
var Dog = (function(){
var privateVal = 'dog'
function doing(val) {
console.log(privateVal + ' ' + val)
}
return {
run: function(){
doing('run')
},
bark: function(){
doing('bark')
}
}
})()
Dog.run() // dog run
Dog.bark() // dog bark
이 를 통 해 알 수 있 듯 이 run 과 bark 두 패 키 지 는 같은 품사 역할 영역 을 공유 하고 개인 적 인 방법 doing 을 참조 했다.이렇게 하면 우 리 는 run 과 bark 두 개의 공공 인터페이스 만 외부 에 노출 시 켜 개인 적 인 변수 와 방법 을 숨 길 수 있다.
폐쇄 와 순환
어쩌면 면접 에서 가장 많이 나 온 문제 일지 도 몰라..
for(var i = 1;i <= 5;i++) {
setTimeout(function() {
console.log(i)
}, i*1000)
}
// 6, 5
우리 가 생각 하 는 순서대로 1 초 간격 으로 1, 2, 3, 4, 5 를 인쇄 하 는 것 이 아니 라 왜 일이 뜻 대로 되 지 않 습 니까?우선, 이 순환 은 5 개의 패 킷 을 만 들 었 고 가장 중요 한 것 은 이 5 개의 패 킷 이 모두 같은 역할 영역 에 있다 는 것 이다. 즉, 같은 i 를 인용 한 것 이다. for 순환 이 끝 날 때 i 는 6 이 되 었 다.그래서 5 개의 익명 함수 가 실 행 될 때 같은 i 를 순서대로 인쇄 하기 때문에 5 개의 6 을 출력 했다.어떻게 해결 합 니까?전에 도 이 다섯 개의 폐쇄 를 서로 다른 역할 영역 에 두 고 각자 의 역할 영역 에서 각자 의 i 를 가지 게 하면 된다 고 말 했다.자체 실행 함수 로 새로운 역할 영역 을 만 들 수 있 습 니 다.
for(var i = 1;i <= 5;i++) {
(function(k){
setTimeout(function() {
console.log(k)
}, k*1000)
})(i)
}
이 코드 세 션 에서 모든 setTimeout 은 하나의 독립 된 역할 영역 에 있 고 각자 의 k 를 인용 하여 외부 역할 영역 을 가리 키 는 i 가 아니 기 때문에 1, 2, 3, 4, 5 도 let 를 사용 할 수 있 습 니 다.
for(let i = 1;i <= 5;i++) {
setTimeout(function() {
console.log(i)
}, i*1000)
}
for 머리 를 순환 하 는 let 는 i 를 for 순환 블록 에 연결 할 뿐만 아니 라 사실상 순환 하 는 모든 교체 에 다시 연결 하여 이전 순환 교체 가 끝 날 때의 값 을 다시 할당 하도록 확보 합 니 다.사실 let 를 사용 하 는 본질은...
for(let i = 1;i <= 5;i++) {
let i = i
setTimeout(function() {
console.log(i)
}, i*1000)
}
사실 폐쇄 는 이렇게 많은 것 이 고 주로 역할 역 의 개념 이 며 역할 역 이 알 면 폐쇄 도 알 수 있다.that's all, thank you.
참고 자 료 를 통 해 자 바스 크 립 트 시 리 즈 를 깊이 이해 합 니 다. - 폐쇄 MDN - 폐쇄 '모 르 는 자 바스 크 립 트 - 상권', '매일 한 문제' JS 의 폐쇄 는 무엇 입 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[반도체 메모리] 기본 정보 기술자의 테스트에 사용되는 컴퓨터의 구조이것은'백목 선생님의 기본 정보 기술자 교실'을 참고하여 학습 내용을 총결한 문장이다. RAM(Random Access Memory)은 읽기와 쓰기가 가능한 메모리입니다.전원을 끊으면 저장된 내용이 사라지는 특성이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.