by Kyojin Hwang
Lexcial Scope(= Static Scope) 란?
Dynamic Scope (동적스코프) 란?
정적스코프 예시
var name = 'Global Name'
function outer() {
var name = 'Outer Name' // 'Outer Name' 변수는 outer 함수 스코프에 속함
function inner() {
// inner 함수는 outer 함수 안에 정의되어 있으므로 outer 함수의 변수 name을 참조
console.log(name)
}
inner() // 'Outer Name' 출력
}
outer()
동적스코프 에시
var name = 'Global Name'
function outer() {
var name = 'Outer Name' // outer 스코프에서 선언된 name
inner() // inner 함수 호출 시점에 스코프를 참조
}
function inner() {
console.log(name) // inner 함수는 호출된 시점의 스코프에서 'Global Name'을 참조
}
outer() // 'Global Name' 출력
스코프 동작구분 결론
특성 | 렉시컬 스코프 (Lexical Scope) | 동적 스코프 (Dynamic Scope) |
---|---|---|
스코프 결정 시점 | 함수가 정의된 위치에 따라 결정 | 함수가 호출된 위치에 따라 결정 |
변수 검색 | 함수가 정의된 위치에서 스코프 체인을 따라 검색 | 함수 호출 시점의 스코프에서 변수를 검색 |
변수의 유효 범위 | 함수가 정의된 스코프 내에서만 유효 | 함수 호출 시점의 스코프에서 유효 |
자바스크립트 동작 | 자바스크립트는 렉시컬 스코프를 사용 | 자바스크립트는 동적 스코프를 사용하지 않음 |
단, this 메커니즘이 동적 스코프와 비슷한 면이있다.
- 전역 스코프는 전역으로 선언된 변수에 대해 접근과 조작이 가능한 유효한 범위를 의미한다.
- 변수가 어떠한 함수에도 속하지 않은 상태
- 어떠한 중괄호 안에 들어있지 않은 상태라면 그 변수를 전역 변수라 부른다.
전역스코프 예시
let global = 'Global!' // 전역 변수
function scope() {
let local = 'Local!' // 지역 변수
console.log(global)
}
scope() // Global!
console.log(local) // local is not defined
- 함수 혹은 블록 내에서 접근(호출)이 가능한 유효한 범위를 의미
- 지역스코프에는
Function Scope
또는Block Scope
존재한다.
함수스코프 예시
function varTest() {
var a = '1' // 함수 내부에서 선언
}
console.log(a) // Uncaught ReferenceError: a is not defined
var 중괄호 에시
if (true) {
var a = '123' // var로 선언하면 블록(중괄호)에 의한 범위 제한이 없음
}
console.log(a) // 123
let,const 중괄호 예시
if (true) {
const a = '123' // const, let은 블록 스코프를 따름
}
console.log(a) // ReferenceError: a is not defined
var와 let,const 차이
function hello() {
for (var i=0; i<12; i++) {
...
}
console.log(i) //접근가능
}
hello(); //12
function hello() {
for (let i=0; i<12; i++) {
...
}
console.log(i)
}
hello(); //ReferenceError: i is not defined
스코프체인 예시
var globalVar = '전역 변수' // 전역 변수
function outerFunction() {
var outerVar = '외부 함수 변수' // 외부 함수 변수
function innerFunction() {
var innerVar = '내부 함수 변수' // 내부 함수 변수
console.log(innerVar) // 내부 함수에서 "내부 함수 변수" 출력
console.log(outerVar) // 외부 함수에서 "외부 함수 변수" 출력
console.log(globalVar) // 전역에서 "전역 변수" 출력
}
innerFunction() // innerFunction을 호출
}
outerFunction() // outerFunction을 호출