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 (~~~ ) 임

 

 

 

+ Recent posts