스코프

Noob·2022년 10월 25일

스코프는 유효범위를 뜻한다. 앞서 다룬 함수에서도 함수 몸체 내부에서만 참조 할 수 있다는게 스코프다.

function add(x,y) {
	return x + y
}
add(1,2)	// 3
console.log(x,y)	// 레퍼런스 에러

그럼 함수내에서 선언한 함수는 어디까지 참조 할 수 있을까?

function out() {		
	let x = 1
    function inn() {
    	let y = 2
        x = y
    }
    inn()
    return x
}
out()	// 2 함수내에서 선언한 함수인 inn이 외부 함수에서 선언한 x에 접근 했다

function out() {		
	let x = 1
    function inn() {
    	let y = 2
    }
    inn()
    x = y
    return x
}
out()	// 레퍼런스 에러 Y를 참조하지 못함

즉 스코프는 식별자가 유효한 범위를 말한다.
그럼 함수 외부와 내부에 같은 이름의 식별자가 있는경우는 어떻게 동작하는지 확인한다.

let x = 1
function test() {

    let x = 2
    console.log(x)
}
test()
console.log(x)
// 2 1 같은 식별자명을 가졌지만 참조하는 식별자는 각각 다른걸 확인 했다.

같은 이름의 변수 중 참조할 변수를 찾는걸 식별자 결정이라 한다. 자바스크립트는 스코프를 통해 어떤 변수를 참조할지 결정하기에 위에 같은 결과가 나온다.

렉시컬 환경??
코드가 어디서 실행되어 주변에 어떤 코드가 있는지를 말한다. 코드의 문맥은 렉시컬 환경으로 이뤄지고 모든 코드는 실행 컨텍스트에서 평가되고 실행된다.

종류

전역과 지역으로 구분 할 수 있다.
전역은 코드의 가장 바깥 영역을 뜻하고 지역은 함수 몸체 내부를 뜻한다.

전역에서 선언된 변수는 어디서든 참조 가능하다. 하지만 지역에서 선언된 변수는 지역 내 자신의 하위 지역 스코프에서만 유효하다.

스코프 체인

저번에 함수 내부에서 함수를 정의하는걸 중첩 함수라 했고 중첩 함수를 포함하는 겉을 외부 함수라 했다.
때문에 함수는 중첩이 가능하며 스코프 또한 중첩이 가능하게 된다. 외부 함수에서 선언된 변수는 중첩 함수에서 참조 가능하다 그 반대는 불가능 하다.

함수레벨 스코프

자바스크립트는 코드 블록 말고 함수에만 지역 스코프가 생성된다. 코드 블록에서도 스코프가 생성된다면 블록 레벨 스코프라하고 반대는 함수 레벨 스코프라 한다.

var x = 1
if(1){
	var x = 2
}
console.log(x)	// 2 if안에서 var 키워로드 x가 선언됐지만 함수가 아닌 코드 블록이기 때문에 전역 변수다.

렉시컬 스코프

자바스크립트는 렉시컬 스코프를 따른다. 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의 했는지에 따라 상위 스코프가 정해진다.

var x = 1
function first() {
    var x = 2
    second()
}
function second() {
    console.log(x)
}

first()		//  1	함수 내부에서 second 함수를 호출 했기 때문에 참조하는 값이 2일줄 알았지만 스코프는 바뀌지 않았다.
second()	//	1
profile
나의 기록

0개의 댓글