자바스크립트에서 클로저란?
4686 단어 codenewbiewebdevjavascript
그 중 하나는 "폐쇄"였습니다. 이 용어는 몇 번 들었지만 실제로 무엇을 의미하는지 이해하지 못했습니다. Kyle Simpson의 정의를 능가하는 것이 어렵다고 생각합니다.
Closure is when a function remembers and continues to access variables from outside its scope, even when the function is executed in a different scope.
그래서, 그것은 어떻게 생겼습니까?
폐쇄의 몇 가지 예
이전에 클로저를 이미 사용했지만 인식하지 못했을 것입니다. 다음 예를 들어 보십시오.
function doAsyncTask(successMsg) {
someAsyncTask().then(() => {
console.log(`I remembered your variable! ${successMsg}`);
});
}
getSuperImporantInfo('Hooray!');
// Some time later...
// I remembered your variable! Hooray!
someAsyncTask
실행이 완료되면 successMsg
에 전달된 doAsyncTask
변수를 출력합니다. someAsyncTask
를 실행하는 데 몇 초 또는 몇 분이 걸릴 수 있지만 then
에 전달된 콜백 함수는 successMsg
변수를 "기억"합니다. 우리는 콜백 함수가 successMsg
이상으로 "닫혔다"고 말합니다.나는 항상 이런 일을 해왔지만 내가 클로저를 사용하고 있다는 것을 몰랐습니다!
이제 카운터 함수를 만들고 싶다고 가정해 보겠습니다. 함수를 호출할 때마다 마지막으로 반환한 숫자 다음에 다음 숫자를 반환합니다. 클로저를 사용하여 반환된 마지막 숫자를 "기억"할 수 있습니다.
function createCounter() {
let count = 0;
return () => count++;
}
const inc = createCounter();
inc();
// 0
inc();
// 1
inc();
// 2
createCounter
는 count
변수에 액세스할 수 있는 익명 함수를 반환합니다. createCounter
에 의해 반환된 함수는 count
에 대해 "폐쇄"됩니다. 우리는 심지어 count
의 고유한 복사본을 갖는 여러 증분 함수를 만들 수도 있습니다.const inc1 = createCounter();
const inc2 = createCounter();
inc1();
// 0
inc2();
// 0
inc1();
// 1
inc1();
// 2
inc2();
// 1
이것들은 간단한 예일 수 있지만 이전에도 이와 같은 카운터 함수를 작성해야 했습니다. 클로저에 대해 알기 전에 전체 모듈에서 볼 수 있는 변수를 만들고 카운터 함수에서 변수를 증가시켰습니다. 이제 모듈 범위를 오염시키지 않아도 되는 더 나은 방법이 있다는 것을 알고 있습니다.
그게 다야! 폐쇄를 유리하게 사용할 수 있는 다른 예는 무엇입니까?
Reference
이 문제에 관하여(자바스크립트에서 클로저란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/brettfishy/what-is-closure-in-javascript-579f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)