2017-12-21 3 views
2

내가 정의한 모든 정의에서 클로저는 함수가 만들어 지거나 다른 함수 내에서 선언 될 때입니다. 이러한 예는 블로그 및 웹 사이트에서 많이 발생합니다. 그러나 함수가 다른 함수 외부에서 선언되었지만 함수 내에서 호출되면 어떨까요? 예 :다른 함수 내에서 함수가 선언 (선언되지 않음)되었을 때 클로저가 작성 되었습니까? 그렇다면 그 이유는 무엇입니까?

const add = (x,y) => { 
    return x + y; 
}; 

const double = num => { 
    return add(num,num) 
}; 

let a = double(6);/*?*/ 

추가 (num, num) 클로저가 생성됩니까? 그렇다면 그 이유를 이해하도록 도와주세요.

+0

아니요,'add (num, num)'(또는'double (6) '호출에서도 생성 된 함수가 없으므로 닫히지 않습니다. – Bergi

답변

1

클로저는 lexical scope의 결과입니다.

폐쇄 함수 및 그 함수가 선언 된 환경 내의 어휘 의 조합이다.

클로저를 만들기 위해 다른 함수 내에서 함수를 정의해야합니다.

예제에서 수행하는 작업은 단순히 다른 것을 호출하고 반환 값을 사용하는 함수를 호출하는 것입니다. 어떤 경우에도 double 함수는 add 함수의 범위에 액세스 할 수 없으며 해당 범위가 다릅니다. 여기

두 경우 모두

var makeAdder = function(x) { 
 
    return function(y) { 
 
     return x + y; 
 
    }; 
 
} 
 

 
var add5 = makeAdder(5); 
 
var add10 = makeAdder(10); 
 

 
console.log(add5(2)); // 7 
 
console.log(add10(2)); // 12

makeAdder 의해 반환 기능은이 탄생하게 된 외측 영역 (생성 영역을 "기억"자바 스크립트 폐쇄 고전적인 예는 makeAdder 함수에 의해).

외부 함수의 범위에 있던 것도 내부 함수의 범위에 있었고 내부 함수가 반환 될 때 그대로 남아 있습니다.

+0

여기 왜 이유를 이해할 수 있습니까? https://stackoverflow.com/questions/615907/how-is-a-closure-different-from-a-callback 컨텍스트 변수를 사용하는 콜백 함수가 클로저라고 설명합니까? –

+0

위의 코드를 const로 쓰면 add = (x, y) => { return x + y; }; const double = (num, func) => { return func (num, num); }; let = double (6, add);/*? */ 클로저가 생성되었습니다. –

+0

@ChaseNorton 클로저가 생성되지 않습니다. 'double'은 콜백을 호출하고 있습니다. 'return function (...) {...} '할 때 클로저를 얻는다. – Barmar

관련 문제