1. 스코프체인
: 스코프가 계속 연결됨. ( 중첩 ) 스코프 안에 스코프 만들기
* 타 언어에서는 안된다 *
- outFunc 안의 inFunc
outFunc 호출 하면 outFunc를 실행하면서 inFunc의 호출명령을 읽으면서 inFunc가 실행된다.
inFunc 는 전역의 a, outFunc의 b 이용.
2. 클로져 (closure) : private ( != public)
스코프 체인을 만들었을 때, 내부함수를 반환하여 저장하면
외부함수에 있는 변수가 보호, 유지 되는것.
여러개의 클로져를 만들어도 각각 별도로 저장된다.
- 일반적인 스코프 체인 실행하기.
: 외부함수 open을 호출하고, open을 실행하면서 inner함수의 선언을 읽고 inner함수의 호출문을 읽으면서 inner함수를 실행한다.
실행한 외부함수 open의 매개변수 x, 지역변수 z, inner함수의 매개변수 y이용하여 z+y+z 결과값 구함.
여러번 실행해도 결과는 항상 같다. 함수를 실행할 때 마다 변수가 다 새롭게 만들어지므로.
- 클로져
내부함수 innerFunc를 반환하도록 함수 close를 만든다.
변수에 close의 반환값을 저장한다 ( 내부함수 innerFunc )
* 저장하는 동시에 외부함수의 변수값들도 같이 저장한다. 클로저 생성.
따로 저장되는 데이터공간이 생긴다. *
- 저장한 값(close의 반환값) 자체를 console에 찍으면
- innerFunc가 반환되어 저장된 변수 sum을 호출하면, 외부함수를 읽지도 않았는데 함수가 잘 실행된다
( return값 저장하는 과정에서 외부함수의 변수도 같이 저장되었기 때문에)
이때 함수를 실행하기 위해 위에 찾아가서 close안에 저장된 innerFunc를 실행하는 것이 아니라 별도로 저장된 클로져 sum을 실행한다.
- 여러번 실행했을 때
: 값이 달라진다.
실행할 때 마다 z값이 1씩 늘어나므로.
클로저가 아닌 일반 스코프체인을 실행 했을 때는 결과값이 항상 같았다
( 항상 외부함수를 실행하면서 z값을 10으로 초기화 했기 때문에)
클로저를 실행할때는 외부함수를 실행하지 않는다. 즉 z 값의 초기화 없음.
대신에 클로저생성시 저장된 z 값을 항상 이용한다.
따라서 함수를 실행 할 때마다 z값이 1씩 늘어난 값이 저장됨.
- close의 반환값 innerFunc를 같이 저장한 변수 total 실행하기
변수sum의 z는 벌써 5나 커져서 40의 결과값을 보이는데 total의 z값은 한번 실행의 결과로 1만 커져있다.
즉 여러개의 변수에 같은 함수의 반환값으로 같은 내부함수를 가지더라도 별도의 데이터 공간을 가진다.
+)
setInterval(function(){},시간)은
var setInterval = function (~~~ ) 임
'프론트엔드 > JavaScript' 카테고리의 다른 글
<JS es6> es6 class +) class 상속 (0) | 2017.09.01 |
---|---|
<JS> 클래스(class) (0) | 2017.09.01 |
<JS> 스코프(scope) (호이스팅, es6 변수) (0) | 2017.09.01 |
<JS es6> let, const, 변수명 만으로 선언하기 (0) | 2017.08.25 |
<JS> JS로 애니메이션 만들기 (setInterval,setTimeout) (0) | 2017.08.11 |