July 08, 2020
const immuVar = 'immuVar' // const, let은 GO, closure가아니라 script라는 새로운곳에 추가됨.
var x = 'xxx'
function outer() {
declareFunc()
var y = 'yyy'
function inner() {
var z = 'zzz'
console.log(immuVar + x + y + z)
console.dir(inner) // [[Scopes]] 로 GO, outer의 변수(클로저)를 참조할 수 있음.
}
inner()
}
outer()
function declareFunc() {
console.log('함수 선언식')
}
var ExpFunc = function() {
console.log('함수 표현식')
}
console.dir(outer)
혹은 console.dir(inner)
를 조회하였을 때, [[Scopes]]
프로퍼티를 갖게되는데, 자신의 실행환경(Lexical Scope)과 자신을 포함하는 외부함수의 환경, 전역객체를 가리킨다. 자신을 포함하는 외부함수의 실행컨텍스트가 소멸하여도 [[Scopes]]
프로퍼티를 유지하고있는데, 이것을 클로저라고한다.[[Scopes]]
프로퍼티는, 해당 범위 내에서 참조할 수 있는 스코프체인 리스트를 말하는것 같다.클로저
[[Scopes]]
의 값으로, GO와 다른 const, let등의 변수를 조회할 수 있다.undefined
가 값으로 설정된다.
var
로 선언되었을 경우만 undefined
의 값을 갖고있으며, const나 let으로 선언되었을 경우 어떠한 값도 갖고있지않는다.console
로 조회할 때, var
이면 undefined
, const
orlet
이면 reference error
var
의 경우 선언 이전에 조회할 수 있는데 이것을 호이스팅이라고 한다.window
에 GO의 내용(전역함수 및 전역변수)가 추가되어있는걸 볼 수 있다.window
+ 생성한 전역변수, 함수)이다.추가적으로 이해를 위해 구글링 중, 더 쉽게 설명된 링크가 있어 복습 겸 다시 정리해보았다!