Post

JAVASCRIPT const, this, hoisting

const란?

▶ const는 JavaScript에서 변수를 선언할 때 사용되는 키워드 중 하나로, 상수를 선언하는 데에 사용됩니다.
const로 선언된 변수는 한 번 할당되면 그 값을 변경할 수 없으며 재할당이 불가능합니다.

1
2
3
4
5
6
7
8
//01
const PI = 3.14159;
PI = 3; // 에러: 상수에 새 값을 할당할 수 없습니다.


//02
console.log(myVar); // 에러: Cannot access 'myVar' before initialization
const myVar = 10;

▶ 위의 01 예시에서 PI는 3.14159라는 상수로 선언을 해주었기 때문에 만약 PI에 다른 값을 할당하려고 하면 에러가 발생하게됩니다. 또한, const로 선언된 변수는 반드시 초기화되어야 하고, 초기화되지 않은 const 변수를 선언했을때도 에러가 발생합니다.
▶ 위의 02 예시처럼 const 또한 let과 마찬가지로 블록 스코프를 가지는데, 만약 초기화되지 않은 변수에 접근하려 하면 일시적 사각지대(Temporal Dead Zone)에 해당되어 에러를 발생됩니다.

this란?

▶ this는 JavaScript에서 현재 실행 중인 코드에서 사용되는 특별한 키워드입니다.
이것은 실행 컨텍스트에 따라 다른 값을 갖게 되는데 아래의 예시와 함께 살펴보겠습니다.

1. 전역 컨텍스트(Global Context)
  • 전역 범위에서 this는 전역 객체를 가리킵니다. 브라우저 환경에서는 window 객체를, Node.js 환경에서는 global 객체를 참조합니다.
2. 함수 내부
  • 함수 내부에서 this는 호출 방식에 따라 다르게 동작합니다.

  • 일반 함수(함수 선언문, 함수 표현식 등)의 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
function myFunction() {
  console.log(this);
}

myFunction(); // 전역 객체(브라우저에서는 window)

const obj = {
  myMethod: function() {
    console.log(this);
  }
};

obj.myMethod(); // obj 객체

▶ myFunction은 전역 함수이므로 호출 시 this는 전역 객체를 가리킵니다. obj.myMethod는 객체 obj의 메서드로, 이를 호출할 때 this는 obj를 가리킵니다.


3. 객체 리터럴 내부의 메서드
  • 객체 리터럴 내부에서 메서드를 정의할 때, 메서드 내부의 this는 해당 메서드를 호출한 객체를 가리킵니다.
1
2
3
4
5
6
7
8
const obj = {
  name: 'Alice',
  greet: function() {
    console.log(`Hello, ${this.name}!`);
  }
};

obj.greet(); // Hello, Alice!

▶ 위의 예시에서 this는 메서드가 호출된 객체를 가리킵니다. 따라서 obj.greet()를 호출하면 this.name은 obj 객체의 name 속성을 참조합니다.


4. 생성자 함수
  • 생성자 함수에서 this는 생성된 인스턴스를 가리킵니다.
1
2
3
4
5
6
7
8
9
function Person(name) {
  this.name = name;
  this.greet = function() {
    console.log(`Hello, ${this.name}!`);
  };
}

const person1 = new Person('Bob');
person1.greet(); // Hello, Bob!

▶ 위의 예시에서 생성자 함수 Person을 사용하여 객체를 생성할 때 this는 생성된 인스턴스를 가리킵니다. 따라서 person1.greet()에서 this.name은 person1 객체의 name 속성을 참조합니다.


Hoisting이란?

▶ 호이스팅(Hoisting)은 JavaScript에서 변수 및 함수 선언이 해당 스코프의 맨 위로 끌어올려지는 현상을 말하며, 변수와 함수 선언의 호이스팅은 각각 조금씩 다른 동작을 합니다.

1. 변수 호이스팅
1
2
3
4
5
6
7
8
console.log(myVar); // undefined
var myVar = 10;

// 위 코드는 실제로 아래와 같이 동작합니다.

var myVar; // 선언(호이스팅)
console.log(myVar); // undefined
myVar = 10; // 초기화

▶ 변수 선언(var, let, const)은 선언 단계와 초기화 단계로 나뉩니다. 호이스팅은 선언 단계까지만 해당 변수를 끌어올리므로, 초기화는 실제 선언이 위치한 곳에서 이루어집니다. var로 선언한 변수는 선언과 초기화가 함께 이루어지며, undefined로 초기화됩니다.

2. 함수 호이스팅
1
2
3
4
5
6
7
8
9
10
11
// 함수 선언문
myFunction(); // Hello!
function myFunction() {
  console.log('Hello!');
}

// 함수 표현식
myFunction(); // TypeError: myFunction is not a function
var myFunction = function() {
  console.log('Hello!');
};

▶ 함수 선언문은 전체 함수가 호이스팅되며, 함수 표현식은 변수만 호이스팅됩니다.
즉, 함수 선언문으로 선언된 함수는 전체가 호이스팅되므로, 함수를 선언하기 전에도 호출할 수 있습니다.
하지만 함수 표현식은 변수만 호이스팅되므로, 변수가 선언되기 전에 함수를 호출하면 에러가 발생합니다.


이렇게 오늘은 const, this, Hoisting에 대해 알아봤는데요,
면접을 준비할 때 나올 수 있는 질문인만큼 미리미리 숙지해서 알아두면 좋겠죠?
그럼 다음엔 또 다른 면접 정보들을 가져와보도록 하겠습니다 😁!

This post is licensed under CC BY 4.0 by the author.