스코프(Scope)
변수 접근 규칙에 따른 유효 범위.
- 가장 바깥의 스코프를 전역 스코프(Global scope)라 부르며, 그 외의 안쪽을 지역 스코프(Local scope)라 부른다.
- if문이나 for문, 함수(function) 처럼 중괄호{}를 기준으로 전역/지역 스코프를 구분
- 전역 스코프에서 선언한 변수는 지역 스코프에서 사용 가능
- 지역 스코프에서 선언한 변수는 전역 스코프에서 사용 불가
- 지역 변수는 전역 변수보다 더 높은 우선순위를 가진다.
let name = 'nine'; // 전역변수
function showName(){
let name = 'floor'; // 지역변수
console.log(name); // 두 번째 출력
}
console.log(name); // 첫 번째 출력
showName();
console.log(name); // 세 번째 출력
// 'nine'
// 'floor'
// 'nine'
let name = 'nine'; // 전역변수
function showName(){
name = 'floor'; // 지역변수
console.log(name); // 두 번째 출력
}
console.log(name); // 첫 번째 출력
showName();
console.log(name); // 세 번째 출력
// 'nine'
// 'floor'
// 'floor'
let username = 'kimcoding';
if (username) {
let message = `Hello, ${username}!`;
console.log(message); // 'Hello, kimcoding!'
}
console.log(message); // ReferenceError
let greeting = 'Hello';
function greetSomeone() {
let firstName = 'Josh';
return greeting + ' ' + firstName;
}
console.log(greetSomeone()); // 'Hello Josh'
console.log(firstName); // ReferenceError
스코프의 종류
블록 스코프(block scope)
중괄호를 기준으로 범위가 구분
함수 스코프(function scope)
function
키워드가 등장하는 함수 선언 및 표현식으로 구분
변수 선언 키워드(let
, var
, const
)
var
로 변수를 선언하면 블록 스코프를 무시하고 함수 스코프만을 따른다. 단, 화살표 함수 형식의 블록 스코프는 무시하지 않는다. →var
는 예전 방식의 변수 선언 키워드이며 블록 스코프를 무시하기 때문에 스코프의 범위가 불분명해짐for (var i = 0; i < 5; i++){ console.log(i); // 다섯 번 반복 } console.log('final i: ' + i); // 'final i: 5'
- 블록 단위로 스코프를 구분하면 훨씬 더 예측 가능한 코드를 작성할 수 있으므로
var
보다let
키워드를 사용 하는 것이 좋다.for (let i = 0; i < 5; i++){ console.log(i); // 다섯 번 반복 } console.log('final i: ' + i); // ReferenceError
var
보다 let
이 안전한 또다른 이유, 재선언
실제 코딩 시 변수를 재선언하는 경우는 대부분 버그이다. var
는 재선언을 해도 아무런 에러도 내지 않지만, let
은 재선언을 하면 문법 에러를 발생시키며 이는 재선언을 방지해준다.
상수를 정의 할 때, const
변하지 않는 값인 상수(constant)를 정의할 때는 const
키워드로 선언한다. const
는 값의 재할당이 불가능하며 재할당 할 경우 TypeError를 내므로 의도하지 않는 값의 변경을 막을 수 있다.
변수 선언 시 주의 할 점
window
객체 (브라우저 only)
브라우저에만 존재하며 브라우저 창을 대표하는 객체. 단, 브라우저 창과 관계없이 전역 항목도 담고 있다.
- 함수 선언식으로 함수를 선언하거나
var
로 전역 변수를 만들면window
객체에서도 동일한 값을 찾을 수 있다.var myName = 'nine'; console.log(window.myName); // 'nine' function foo(){ console.log('bar'); } console.log(foo === window.foo); // true
전역 변수는 최소화 할 것
전역변수는 가장 바깥 스코프에 정의한 변수이기 때문에 어디서든 접근이 가능하다. 단순히 생각하면 편리하다 느낄 수 있지만 실제 어플리케이션을 제작할 때는 내가 작성하지 않은 수많은 함수와 로직을 사용하기 때문에 의도치 않은 변경이나 문제, 즉 부수 효과(side effect)가 발생 할 수 있다. 전역 변수를 최소화 하는 것이 side effect를 줄이는 좋은 방법이다.
let
, const
를 주로 사용할 것
var
는 블록 스코프를 무시하며 재선언을 해도 에러를 내지 않는다. → 같은 스코프에서 동일한 이름의 변수를 재선언하는 것은 버그를 유발한다
- 전역 변수를 var로 선언하는 것은 문제가 될 수 있다.
→
var
로 선언한 전역 변수가window
기능을 덮어씌워서 내장 기능 사용불가를 발생시킬 수 있다.
선언 없는 변수 할당 금지
선언 키워드 없이 변수를 할당하면 해당 변수는 var로 선언한 전역 변수처럼 취급된다.
function showAge(){
age = 90; // age는 전역 변수로 취급된다
console.log(age); // 90
}
showAge();
console.log(age); // 90
console.log(window.age); // 90
☝
Uploaded by N2T