기록 전체보기/JavaScript
스코프(scope)와 호이스팅(Hoisting)
Kyoo130
2022. 7. 30. 13:52
본 게시글은 개인 공부를 하면서 기록 목적으로 작성하였습니다.
잘못된 내용이 있다면 제보 부탁드립니다. 감사합니다.🙇♂️
1. 스코프(scope)
스코프(scope) 란?
- 스코프(scope)는 변수나 매개변수를 참조할 수 있는(접근할 수 있는) 유효한 범위를 결정한다.
- 선언된 위치에 따라 유효 범위가 결정되며, 자바스크립트의 스코프는 블록과 함수 단위의 스코프로 나눌 수 있다.
블록 스코프
- 블록 스코프에서는 변수의 유효 범위를 블록({}) 단위로 제한하여 사용할 수 있다.
- 코드 블록 외부에서는 블록 내부의 변수를 참조할 수 없다.
- 코드 블록
- {}
- if() {}
- for() {}
- function() {}
{
const name = 'Kyoo';
console.log(name); // Kyoo
}
console.log(name); // ReferenceError: name is not defined
함수 스코프
- 함수 스코프는 선언된 함수 단위로 생성되는 스코프로, 함수 스코프 안에 선언된 변수나 함수들은 모두 함수 스코프에 포함된다.
- 함수 외부에서는 함수 내부의 변수를 참조할 수 없다.
function myName() {
const name = 'Kyoo';
console.log(name);
}
myName(); // Kyoo
console.log(name); // ReferenceError: name is not defined
- 함수 외부에서는 함수의 매개변수를 참조할 수 없다.
function sum(a, b) {
console.log(a, b);
}
sum(1, 3);
console.log(a, b); // ReferenceError: a is not defined
스코프 참조 범위
- 블록 안에 있는 변수는 외부에서 참조할 수 없다.
- 블록이 중첩되어 있어도 자식 블록은 부모(상위)의 변수를 참조할 수 있다.
{
const a = 1;
{
const b = 2;
console.log(a); // 1
}
console.log(a); // 1
console.log(b); // ReferenceError: b is not defined
}
- 스코프는 블록 안에서 유효 범위가 결정된다.
- 근접한 블록 안에 변수를 접근한다.
const text = "global"; // 전역 변수, 전역 스코프 (글로벌 변수, 글로벌 스코프)
{
const text = "inside block"; // 지역 변수(로컬 변수), 지역 스코프(로컬 스코프)
{
console.log(text); // inside block
}
}
const text = "global";
{
// const text = "inside block";
{
console.log(text); // global
}
}
2. 호이스팅(Hoisting)
호이스팅(Hoistiong) 이란?
- 자바스크립트 엔진이 코드를 실행하기 전 변수, 함수, 클래스의 선언문을 끌어 올리는 것을 말한다.
(= 변수의 선언과 초기화를 분리한 후, 선언한 코드만 최상단으로 옮긴다.)
함수 호이스팅
- 함수의 호이스팅은 함수의 선언문 이전에도 호출이 가능하게 해준다.
- 함수의 선언문은 선언 이전에도 호출이 가능하다.
myName() // 선언문을 끌어올린다.
function myName() {
console.log("Kyoo");
}
변수 호이스팅
- var 키워드로 선언한 변수는 선언과 초기화 단계를 한번에 실행한다.
- 선언: 스코프에 변수를 선언한다.
- 초기화: 변수의 값을 undefined로 초기화하며, 실제로 변수에 접근 가능한 단계를 말한다.
- 아래 예제와 같이 var 키워드로 선언한 변수는 선언과 초기화 단계를 한번에 실행하여 스코프 최상단으로
끌어올려져 실행되기 때문에 선언하기 전에 변수에 접근하여도 이미 초기화가 되어 접근이 가능하다.
console.log(name); // undefined
var name = 'Kyoo';
// 스코프의 최상단에서 변수 name의 선언과 초기화가 한 번에 실행된다.
var name; // 선언 및 초기화
console.log(name); // undefined
name = 'Kyoo'; // 할당
- 함수 내에 선언된 변수는 함수 스코프 안에서 호이스팅이 발생한다.
function myName() {
console.log(name);
var name = 'Kyoo';
};
// 함수 스코프 내에 최상단에서 변수 name의 선언과 초기화가 한 번에 실행된다.
function myName() {
var name;
console.log(name);
name = 'Kyoo';
};
- let과 const 키워드로 선언한 변수는 var 키워드와 다르게 선언과 초기화 단계가 분리되어 실행된다.
- 변수(let, const)와 클래스는 선언만 호이스팅이 된다. (※ 초기화는 안된다.)
- 초기화 전, 변수에 접근하면 컴파일(빌드) 에러가 발생한다.
// 컴파일(빌드) 에러
let hi = 'hi';
let func1 = function() {};
const cat = new Cat();
class Cat {};
참 고
기초부터 완성까지, 프런트엔드 (이재성, 한정)