先 공식 도입에 앞서 클로저에 대한 좀 더 어려운 면접 질문을 공식적으로 소개하기 시작했습니다:
Function Fun (n, O) {
Console.log (o)
Return {
Fun: Function (m) {
RETURN FUN (
재밌어요 m,n);
m, ; .fun(1).fun(2).fun(3);
var c = fun(0).fun(1); c.fun(3);
//질문 3 행 a, b, c의 출력은 무엇입니까?
(원본 링크: http://www.cnblogs.com/xxcanghai/p/4991870.html)
이 질문은 모든 사람에게 까다로울 것입니다. 특히 기초가 탄탄하지 않은 초보자에게는 혼란스럽습니다. 이 재미있는 함수가 하는 일을 대략적으로 설명하겠습니다(이 내용은 기사 마지막 부분에서 분석하겠습니다). 먼저 두 번째 매개변수를 출력한 다음 객체를 반환합니다. 이 객체에는 fun 메서드가 있고 그 다음에는 re
메서드가 있습니다. turns fun(m,n)--가장 바깥쪽 함수의 실행 결과; 기본 프로세스를 대략적으로 이해하면 대략적으로 분석할 수 있지만 클로저에 대해 이야기하기 전에 먼저 이야기해 보겠습니다.
js 스코프 체인:
Node.js 코드(전역 코드 또는 함수)(여기에 주의하세요. 칠판을 두드리세요!!!)에는 이와 관련된 범위 체인이 있습니다. 이
스코프 체인은 객체의 목록 또는 연결된 목록입니다. 이 객체 그룹은 js가 변수 해상도의 값을 찾아야 하는 경우)')의 첫 번째 객체에서 검색합니다. 첫 번째 개체에서 찾을 수 없으면 다음 개체를 검색합니다.
js의 최상위 코드에서 범위 체인은 전역 개체로 구성됩니다. 중첩이 포함되지 않은 함수 본문에는 범위 체인에 두 개의 개체가 있습니다. 첫 번째는 함수가 매개 변수와 지역 변수를 정의하는 개체이고 두 번째는 전역 개체입니다.两 上 上 - 위 두 문단의 내용은 JS 권위 있는 가이드에서 나온 것인데, 이는 Rhino book
이 함수로 정의되면 실제로 도메인 체인을 보존한다는 것입니다. 이 함수가 호출되면 지역 변수를 저장할 새 개체를 만들고, 저장된 범위 체인에 개체를 추가하고, 함수 호출 범위를 나타내는 새롭고 긴 체인을 만듭니다. 중첩된 함수의 경우
외부 함수가 호출될 때마다 범위 체인이 달라지며, 외부 함수가 호출될 때마다 내부 함수의 코드가 동일하며
가 연결됩니다. this 코드 세그먼트의 범위 체인도 다릅니다.是 - 위 내용도 JS 권위 가이드, 즉 Rhino 책
에서 가져온 것입니다. 아마도 각 기능이 도메인 체인을 형성하며 도메인 체인이 다르며 액세스할 수 있는 내용이 동일하지 않다고 요약한 것 같습니다. 도메인 체인 체인 체인에
객체 정렬 관계를 기반으로 변수에 액세스할 때 근접성 원칙이라는 한 가지 원칙을 따를 수 있습니다.
범위에 대해 이야기한 후 클로저에 대해 이야기해 보겠습니다.
간단히 말해서 혼란스러운 범위 체인이 클로저의 원인입니다.
아주 간단한 예를 들어보겠습니다.
var d;
function otter(){
var c = 0;
console.log(c);
d = function(){ c++;~ ~ 일반적으로 js 함수가 호출될 때마다 지역 변수를 저장하기 위해 새 개체가 생성되고 이 개체는 함수가 반환될 때 범위 체인에서 제거됩니다. 중첩된 함수가 없고 이 바인딩 개체에 대한 다른 참조 지점이 없으면 가비지 수집됩니다. 중첩 함수가 정의된 경우 각 중첩 함수는 자체 범위 체인을 형성하고 이 범위 체인은 변수 바인딩 개체를 가리킵니다. 이러한 중첩 함수 개체가 외부 함수에 저장되면 변수처럼 가비지 수집됩니다. 그것이 가리키는 바인딩 객체. 그러나 이러한 중첩 함수가 반환 값으로 반환되거나 어딘가에 속성에 저장되면 중첩 함수를 가리키는 외부 참조가 있게 됩니다. 가비지 컬렉션으로 처리되지 않으며, 가리키는 변수 바인딩 객체도 가비지 컬렉션으로 처리되지 않습니다!
따라서 위 코드에서 outter를 호출한 후 외부 변수 d는 중첩된 함수를 참조하므로 outter의 실행이 완료된 후에는 d가 가리키는 중첩된
함수와 이것이 가리키는 변수 바인딩 개체가 재활용되지 않습니다. 그래서 c는 재활용되지 않으므로 미래의 이야기가 있습니다. . .
클로저에 대해 영어로 설명하겠습니다(다음은 MDN의 설명에서 따옴):
클로저는 함수와 해당
함수가 선언된 어휘 환경의 조합입니다.
무슨 뜻인가요? 위 내용을 직접 번역하면 클로저는 함수와 함수가 선언되는 어휘 범위 환경의 조합입니다.
처음에 언급한 질문에 대해 이야기해 보겠습니다.
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var b = fun (0) .fun (1) .fun (2) .fun (3) :
fun(0) => n = 0,o = 정의되지 않음;
콘솔. log(o); => o = undefine;print undefine
return { fun: function(m){ return fun(m,n ) } } => fun, m = 정의되지 않음, n = 0, 이 범위 체인은 반환된 객체의 속성에 의해 유지됩니다
fun(0).fun (1):
~ 기능 기능:
fun (n, o) = & gt; = 1, o = 0;
console.log (o) = & gt; print 0
Return {fun: ... Return fun (m, n)} = & gt ; 위에서 스코프 체인이 저장되었습니다
fun(0).fun(1).fun(2):
또는 반환된 객체의 fun 메서드가 호출됩니다:
function(m) => m=2
, , ‐ ‑ - — 그런 다음 인쇄 O는 인쇄 1입니다. . . ㅋㅋㅋ " m, n) m = 3, n = 2
fun (n, o) = & gt; n = 3, o = 2
을 호출한 다음 o를 인쇄하여 2를 인쇄합니다. . .
… ~ 마지막 b는 객체를 반환하는 fun 메소드를 호출하는 것인데, fun이 실행되면 객체를 반환하므로 b는 객체이고, fun 값 함수로 key를 갖는
속성이 있습니다. 이 속성을 그를 메소드라고 부릅니다.
사실 제가 얘기하고 싶은 점은
클로저를 사용하는 한 클로저를 사용한다는 의미이므로 가능하면 클로저를 사용하세요. 메모리에 공간이 있으면 프로그램에서 반드시 사용할 수는 없지만 컴퓨터가 실행 중일 때는 다른 프로그램에서 사용할 수 없습니다. 이는 의심할 바 없이 프로그램 성능에 영향을 미칩니다.
위 내용은 JS 클로저 에세이의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!