스코프는 변수의 유효범위를 뜻한다.
let username = 'kimcoding';
if(username) {
let message = `Hello, ${username}!`;
console.log(message); // Hello, kimcoding!
}
console.log(message); // ReferenceError
변수에 접근할 수 있는 범위가 존재한다. 중괄호(블록) 안쪽에 변수가 선언되었는가, 바깥쪽에 변수가 선언되었는가가 중요하다. 이 범위를 우리는 스코프라고 부른다.
let name = '김코딩';
function showName() {
let name = '박해커'; // 지역 변수
console.log(name);
}
console.log(name); // 김코딩
showName(); // 박해커 (지역 변수 우선)
console.log(name); // 김코딩
중괄호를 기준으로 범위가 구분된다.
if(true){
// ... 블록스코프
}
for(let i = 0; i < 10; i++){
// ... 블록스코프
}
{
// ... 블록스코프
}
function 키워드가 등장하는 함수 선언식 및 함수 표현식은 함수 스코프를 만든다.
function getName(user) {
// ... 함수스코프
}
let getAge = function(user) {
// ... 함수스코프
}
화살표 함수는 함수 스코프가 아닌 블록 스코프로 취급한다
let getAge = user => {
return user.age;
}
같은 함수여도, 화살표 함수를 사용하면 블록 스코프로 취급된다.
let getAge = function(user) {
return user.age
}
function 키워드를 사용하면 함수 스코프이다.
이는 화살표 함수와 일반 함수의 가장 큰 차이점이다.
| let | const | var | |
|---|---|---|---|
| 유효 범위 | 블록 스코프 및 함수 스코프 | 블록 스코프 및 함수 스코프 | 함수 스코프 |
| 값 재할당 | 가능 | 불가능 | 가능 |
| 재선언 | 불가능 | 불가능 | 가능 |
var myName = '김코딩';
console.log(window.myName); // 김코딩
function foo(){
console.log('bar);
}
console.log(foo === window.foo) // true
선언 키워드(var, let, cosnt)없이 변수를 할당하면, 해당 함수는 var로 선언한 전역 변수처럼 취급된다.
function showAge(){
age = 90; // age는 전역 변수로 취급됨
console.log(age); // 90
}
showAge();
console.log(age); // 90
console.log(window.age); // 90
age는 선언한 적 없으나, 값을 할당하면서 마치 var로 선언된 전역 변수처럼 동작한다.
js 파일 상단에
'use strict'을 입력해 Strict Mode로 더 안전하게 코드를 작성할 수 있다.