Script scope?

윤강석·2023년 1월 31일
0

부끄럽지만 script scope 란 용어를 이제서야 처음 들어봤다. 콘솔창에서 const, let 으로 선언된 함수의 scope 를 보면 쉽게 "script" scope 를 볼 수 있다. local, global 이 아닌 sciprt scope 는 뭔가 싶어서 찾아보았고 아래 답글에서 정말 친절한 댓글이 있어서 기록 해보려 한다.
출처)https://stackoverflow.com/questions/40685277/what-is-the-purpose-of-the-script-scope

문제의 핵심은 우리가 너무 잘 알고 있는 var 와 let, const 사이의 구분에서 왔다. 이미 너무 알려져 있는 이들 사이의 차이는 호이스팅 문제이다. 사실 호이스팅은 모두에서 발생하지만 var 의 경우 선언 이후 초기화 단계까지 발생하여 코드 진행에 있어 문제가 생긴다. 정확히 말하면 var 의 경우 선언 단계에서 window 의 property 로 들어가고 동시에 초기화 까지 마치는 것이다.
하지만 let, const 의 경우 렉시컬 환경에서 저장되기에 선언만 되는 것이다.

그럼 이 문제만 있는 var 는 왜 let, const 와 공존하는가? 이는 사실 초기에는 var 밖에 없었지만 호이스팅 문제를 해결하고자 let, const 가 등장한 것 이기에 var를 없앨 수는 없었던 것이다. 이 let, const 는 var 와 다르게 다루기 위해서 등장한 것 또한 렉시컬 환경인 것이다.

전역에서 선언된 var, let, const 는 똑같이 전역 변수이다. 그러나 둘은 다른 환경에서 저장이 되는데 어떻게 같게 다뤄지겠는가. 이를 잘 보정하고자 도입한 것이 "Script scope" 이다. 엄밀히 말하자면 JavaScript 자체에는 script scope 라는 것이 없다. 이는 구글의 V8엔진이 js 코드를 읽고자 불러내는 환경이다.

이 scope 의 목적은 "기존의 글로벌 환경"을 헤치지 않고 두개의 scope 가 마치 하나의 scope 인 것처럼 동작할 수 있게 하기위한 scope 이다. 정리하자면 선언시 var 의 경우 기존의 scope "object environment record" 인 윈도우 객체의 property 로 들어가고, let, const 의 경우 Script scope 의 관리하에 현재 렉시컬의 "declarative environment record" 에 기록이 되게 된다.

과거 deep dive 를 읽을 당시 렉시컬이 어떻게 구성되는가에 대해선 알고 있었으나, 그 배경에 let, const를 도입하며 만들어진 환경이었단 것은 이번 조사에서 알았다.

0개의 댓글