JavaScript에서 Closure를 배우는 가장 좋은 방법은 무엇입니까?
나는 이것을 주는 쓰레기를 잘라낼 것입니다:
a function inside a function bla bla... is closure.
대신 내가 할 일은 아래 👇 코드의 출력을 스캔하고 이해하는 데 필요한
1 minute
스니펫을 제공하는 것입니다(컴파일러에서 실행하거나 답을 조사하지 않고).완료되면 답변을 확인하고 개념을 배울 수 있습니다.
자유롭게 댓글을 달아주세요. 응답하고 함께 배우기를 원합니다.
let cachedFunc = null
function log(message) {
if (!cachedFunc) {
// creates a function that closes over `message`
// keep in mind `message` inside `log` is different
// on each call
cachedFunc = () => console.log(message)
}
cachedFunc();
}
log("hello")
log("goodbye")
아래 답변을 비교하십시오.
답변을 확장하려면 클릭하세요.
단계별 실행:
cachedFunc
는 null
와 함수 log
로 선언됩니다. log("hello")
를 호출할 때 log
함수를 호출하는 컨텍스트는 선언된 cachedFunc
와 동일하므로 외부 범위에서 선언된 값을 null
로 찾습니다. if condition
내부에서 인수cachedFunc
를 콘솔에 인쇄하는 인라인 함수로 message
를 업데이트합니다. cachedFunc
메서드를 호출합니다. 두 번째 호출
log("goodbye")
에서 메서드를 다시 초기화하지 않습니다.So it will call the method that was in previous scope, in which the value of
message
is "hello" and that's why it will print the same "hello" again.
Reactjs와 관련된 추가 설명:
후드 아래에서
useCallback
는 매우 유사한 방식으로 작동합니다. 첫 번째 렌더링에서 React는 전달한 함수useCallback
를 어딘가에 저장하고 항상 해당 함수를 반환합니다.다른 모든 렌더링에는 저장된 기능이 있으며 이전 값을 포함하여 생성된 범위를 "기억"합니다.
useCallback
또는 종속 항목을 추가하지 않으면 각 렌더링 또는 종속 항목 변경 시 새 함수가 생성됩니다. 즉, 최신 값으로 new를 참조할 수 있습니다.다음은 codepen에 대한 링크입니다. :)
문안 인사.
Reference
이 문제에 관하여(JavaScript에서 Closure를 배우는 가장 좋은 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mnathani/best-way-to-learn-closure-in-javascript--29dp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)