개발의변화
모던자바스크립트 13장 스코프 본문
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 var1 = 1; // 코드의 가장 바깥 영역에서 선언한 변수
if (true) {
var var2 = 2; // 코드 블록 내에서 선언한 변수
if (true) {
var var3 = 3; // 중첩된 코드 블록 내에서 선언한 변수
}
}
function foo() {
var var4 = 4; // 함수 내에서 선언한 변수
function bar() {
var var5 = 5; // 중첩된 함수 내에서 선언한 변수
}
}
console.log(var1); // 1
console.log(var2); // 2
console.log(var3); // 3
console.log(var4); // ReferenceError: var4 is not defined
console.log(var5); // ReferenceError: var5 is not defined
모든식별자(변수,함수,클래스)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효범위가 결정
var x = 'global';
function foo() {
var x = 'local';
console.log(x); // ①
}
foo();
console.log(x); // ②
스코프: 식별자를 검색할 때 사용하는 규칙
하나의 값은 하나의 식별자에 매칭이 되어야 한다.
point
``js
function foo() {
var x = 1;
// var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용한다.
// 아래 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다.
var x = 2;
console.log(x); // 2
}
foo();
```js
function bar() {
let x = 1;
// let이나 const 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용하지 않는다.
let x = 2; // SyntaxError: Identifier 'x' has already been declared
}
bar();
전역스코프, 지역스코프
전역 스코프: 코드의 가장 바깥 영역
지역 스코프: 함수 몸체 내부
// 전역 함수
function foo() {
console.log('global function foo');
}
function bar() {
// 중첩 함수
function foo() {
console.log('local function foo');
}
foo(); // ①
}
bar();
상위스코프에서 유효한 변수는 하위 스코프에서 ㅈ유롭게 참조할 수 있지만 하위 스코프에서 유효한 변수를 상위 스코프에서 참조할 수 없다ㄴ
함수 레벨 스코프
var키워드로 선언된 변수는 오로지 함수의 코드 블록(함수 몸체)만을 지역스코프로 인정
var x = 1;
if (true) {
// var 키워드로 선언된 변수는 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다.
// 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 모두 전역 변수다.
// 따라서 x는 전역 변수다. 이미 선언된 전역 변수 x가 있으므로 x 변수는 중복 선언된다.
// 이는 의도치 않게 변수 값이 변경되는 부작용을 발생시킨다.
var x = 10;
}
console.log(x); // 10
var i = 10;
// for 문에서 선언한 i는 전역 변수다. 이미 선언된 전역 변수 i가 있으므로 중복 선언된다.
for (var i = 0; i < 5; i++) {
console.log(i); // 0 1 2 3 4
}
// 의도치 않게 변수의 값이 변경되었다.
console.log(i); // 5
const,let은 블록레벨스코프를 지원
블록레벨스코프는 모든 코드 블록(if,for,while,try/catch)에 스코프를 가짐
렉시컬 스코프
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
스코프의 종류
동적 스코프: 함수를 어디서 호출했는지에 따라 함수의 상위 스코프를 결정
렉시컬 스코프: 함수를 어디서 정의했는지에 따라 함수의 상위 스코프를 결정
자바스크립트는 렉시컬 스코프를 따름
즉 함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지 않는다.
함수의 상위 스코프는 언제나 자신이 정의된 스코프
이처럼 함수의 상위 스코프는 함수 정의가 실행될 떄 정적으로 결정 -> 함수 정의가 실행되어 생성된 함수 객체는 이렇게 결정된 상위 스코프 기억