호다닥

Day 6. Closure 본문

바닐라코딩

Day 6. Closure

3jun 2018. 6. 2. 15:31


자바스크립트의 값들에는 Primitive 타입 vs Reference 타입이 있다.


 function에서의 hoisting은 function의 바로 밑까지 된다.



Closure

어떤 함수가 자기 자신이 속한 스코프의 정보를 기억하고 본인이 속한 스코프 밖에서 실행된다 하더라도 본인이 속한 스코프에 대한 정보를 기억하고 접근할 수 있는 성질이다.

기본적인 룰을 약간 벗어나서 사용할 수 있게 해주는 것이다.


29번째 줄에서 say라는 함수가 선언되고,

38번째 줄에서 변수 a에 say라는 함수를 할당하고 실행하면

30번재 줄에서 say함수의 내부스코프가 실행되어 변수 a는 로그함수가 된다.


일반적으로 say함수 내부에서 변수 a에 2가 할당된 것은 say함수가 실행종료되면 쓸모 없어지게 되는데, log를 실행하면 변수 a는 2 값을 그대로 가지고 있게 된다.

이것은 로그 함수가 만들어 질 때, 선언된 당시의 스코프에 있던 변수정보를 기억하게 되기 때문이다. 

(Closure 생성)




57번째 doSomthing(); 를 실행하면 46번째~ 52번째 줄 사이의 함수스코프가 실행되어
변수 a가 선언되고 something 함수가 생성된다. 이 때 something함수는 생성되는 당시의 스코프의 외부정보들을 기억할 수 있게 된다. 
때문에 외부스코프인 55번째 줄 코드에서 실행된다고 하더라도 var a = 1; 를 기억할 수 있게 된다.



한번 Closure가 생성되면, 이후에는 스코프의 변수정보가 바뀌는 것도 인식하여 기억할 수 있다.




브라우저에서 Developer tools를 사용할 때, debugger; 코드를 입력하면 중간에 코드 실행을 멈출 수 있다.
debugger를 사용하면 코드들이 어떤 순서로 작동하는지 확인할 수 있다.





currying ??



this 값이 변하는 경우는 크게 4가지가 있다.

this는 항상 object이다.
this가 들어있는 함수, 해당 함수를 어떻게 실행하느냐에 따라 바뀝니다.
그리고 함수를 실행하는 방법엔 크게 4가지가 있습니다.

this값을 가지고 있는 함수가 호출되는 부분이 어디인지를 확인하는 것이 중요하다.

1. 일반 함수 실행 방식 Regular function call



여기서 foo 함수는 전역스코프인 64번째 줄에서 실행된다. (일반함수 호출 방식으로)

때문에 여기서 this는 window이다.


foo 함수는 obj.log이기 때문에 63번째 줄에 의해 say함수는 foo 함수가 된다.





'use strict';            // 이런 문자열을 입력하면 strict mode로 작동한다.

엄격한 모드가 아니라면,

window에 접근하려면 window를 쓰지, this를 써서 window에 접근하는 것은 버그일 확률이 높다.



strict mode에서 this는 무조건 undefined이다.
strict mode가 아닌 경우에 this는 모두 window이다.(일반함수실행방식 일때)



여기서 this는 window 이므로 console.log(this.age); 의 값은 100이다.















'바닐라코딩' 카테고리의 다른 글

Day 8. protoype  (0) 2018.06.07
Day7. this, prototype  (0) 2018.06.05
Day 5. argument / scope / hoisting / closure  (0) 2018.05.31
Day3, 4. Event  (0) 2018.05.29
Koans  (0) 2018.05.28
Comments