자바스크립트에서 클로저...
4333 단어 corejavascript
함수는 어휘 환경/범위(해당 로컬+상위 범위)와 함께 바인딩됩니다.
function x(){
var a = 7;
function y(){
console.log(a)
}
y();
}
x();
# output
7
# debugger for line
# console.log(a)
Closure(x)
a:7
함수 내에서 함수 반환
function x(){
var a = 7;
function y(){
console.log(a)
}
return y;
}
let res = x();
console.log(res);
# output
F:y(){
console.log(a);
}
x()에서 반환된 후 x는 호출 스택에서 완전히 사라졌지만 여전히 y()는 클로저에서 관련된 변수와 함수를 기억합니다.
# the inner function remembers the binding variables and the functions due to closure and even after the function that calls inner function gets vanished from call stack the inner fnction will remember the refferences to the outer function.
function x(){
var a = 7;
function y(){
console.log(a)
}
return y;
}
let res = x();
res();
OR
function x(){
var a = 7;
return function y(){
console.log(a);
}
}
let res = x();
res();
# output
7
클로저에 대한 몇 가지 출력 예측 질문
function x(){
var a = 7;
function y(){
console.log(a);
}
a = 100;
return y;
}
let res = x();
res();
# output
100
다단계 폐쇄
function z(){
var b = 900;
function x(){
var a = 7;
function y(){
console.log(a,b);
}
y();
}
x();
}
z();
# debugger at console.log(a,b)
Closure (x)
a:7
Closure (z)
b:900
클로저 사용
setTimeout + 클로저 인터뷰 질문
function x(){
var i = 1;
setTimeout(function(){
console.log(i);
},3000)
}
x();
# output
# prints 1 after 3 second from
# the time the x is called
1
function x(){
var i = 1;
setTimeout(function(){
console.log(i);
},3000);
console.log("olaaa");
}
x();
# output
olaaa
#after 3 seconds
1
까다로운 질문 문제는 1이 1초 후에 인쇄되어야 하는 것과 같이 1에서 5까지의 숫자를 인쇄하는 것입니다. 2는 2초 후에 인쇄해야 합니다.
function x(){
for(var i=1;i<=5;i++){
setTimeout(function(){
console.log(i);
},i * 1000);
}
console.log("olaaa");
}
x();
# output
olaaa
6
6
6
6
6
이 문제를 해결하기 위해 var 대신 let을 사용할 수 있습니다. let은 블록 범위가 있고 루프가 실행될 때마다 i는 완전히 새로운 변수입니다. 즉, i의 새 복사본이 만들어집니다. 즉, let을 사용할 때 변경된 i 값마다 다른 메모리 위치가 사용됩니다.
function x(){
for(let i=1; i <= 5; i++){
setTimeout(function(){
console.log(i);
},i * 1000);
}
console.log("olaaa");
}
x();
# output
olaaa
1
2
3
4
5
클로저를 통해 let을 사용하지 않는 중요한 솔루션, 즉 함수를 만들고 그 안에 setTimeout을 넣어 innerfunction이 호출될 때마다 i에 대한 새로운 메모리 위치를 생성합니다.
function x(){
for(var i=1; i <= 5; i++){
# making a explicit closure for setTimeout
function close(i){
setTimeout(function(){
console.log(i);
},i * 1000);
}
# we are calling the close() function with new copy of i different memory location
close(i);
}
console.log("olaaa");
}엑스();
# output
olaaa
1
2
3
4
5
내 친구 좋은 하루 보내세요!!
Reference
이 문제에 관하여(자바스크립트에서 클로저...), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jasmeetbali/closures-in-javascript-41c9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)