function add(x,y) {
console.log(x,y) // 2 5
return x+y;
}
add(2,5);
console.log(x,y) // ReferenceError: x is not defined
- 모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정되고 이를 스코프라 한다.
= 스코프 : 식별자가 유효한 범위
var x = 'global';
function foo() {
var x = 'local';
console.log(x); // (1)
}
foo();
console.log(x); // (2)
//(1), (2)의 두 개의 x 변수는 식별자 이름이 동일하지만 스코프가 다른 별개의 변수이다.
☝🏻 렉시컬 환경 : 코드가 어디서 실행되며 주변에 어떤 코드가 있는지
☝🏻 실행 컨텍스트 : 렉시컬 환경을 구현한 것
=> 모든 코드는 실행 컨텍스트에서 평가되고 실행된다.
🔥 만약, 스코프라는 개념이 없다면 같은 이름을 갖는 변수는 충돌을 일으키므로 프로그램 전체에서 하나밖에 사용할 수 없다.
스코프는 네임스페이스이다.
= 스코프 내에서 식별자는 유일해야 하지만 다른 스코프에서는 같은 이름의 식별자를 사용할 수 있다.
전역 스코프 > outer 지역 스코프 > inner 지역 스코프
☝🏻 함수 레벨 스코프 : var 키워드로 선언된 변수는 오로지 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다.
var x = 1; if(true) { var x = 10; // 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 모두 전역 변수이다. // 따라서 x는 전역 변수이다. // 이미 선언된 전역 변수가 있으므로 x 변수는 중복 선언된다. // 이는 의도치않게 변수 값이 변경되는 부작용을 발생시킨다. } console.log(x); //10