자바스크립트에서 this 키워드는 무엇을 의미하나요?
_____A: `this` 키워드는 현재 실행 컨텍스트(context)에 따라 달라지는 특별한 참조 변수로, 일반적으로 "현재 코드가 속한 객체"를 가리킵니다. 즉, `this`는 그 시점에 실행되고 있는 함수나 메서드가 속한 객체를 참조합니다.
---
자바스크립트 `this`의 동작 원리 FAQ
Q1: 전역 컨텍스트에서 `this`는 무엇을 가리키나요?
A: 전역 컨텍스트에서 `this`는 브라우저에서는 전역 객체인 `window`를, Node.js에서는 `global` 객체를 가리킵니다. 단, ES6 모듈이나 `strict mode`에서는 `undefined`가 됩니다.
Q2: 함수 내부에서 `this`는 어떻게 결정되나요?
A: 일반 함수에서는 호출하는 방식에 따라 다릅니다. 전역 함수로 호출 시 전역 객체를 가리키고(`strict mode`에서는 `undefined`), 메서드로 호출하면 그 메서드를 포함한 객체를 가리킵니다.
Q3: 객체의 메서드 내에서 `this`는 어떤 객체를 참조하나요?
A: 메서드를 호출한 객체를 참조합니다. 예를 들어, `obj.method()`에서 `method` 내의 `this`는 항상 `obj`를 가리킵니다.
Q4: 화살표 함수에서 `this`는 어떻게 동작하나요?
A: 화살표 함수는 자신만의 `this` 바인딩을 갖지 않고, 선언된 주변 스코프의 `this`를 그대로 상속받는(lexical binding) 특징이 있습니다.
Q5: 생성자 함수 또는 클래스 내에서 `this`는 무엇을 의미하나요?
A: 새로 생성되는 인스턴스 객체를 가리킵니다. 생성자 함수에서 `this`는 새 인스턴스이며, 이를 통해 프로퍼티나 메서드를 초기화할 수 있습니다.
A: 세 메서드 모두 함수 호출 시 `this`를 명시적으로 지정할 수 있게 해 줍니다.
- `call(thisArg, arg1, arg2, ...)`는 첫 번째 인자를 `this`로 하여 함수를 즉시 호출합니다.
- `apply(thisArg, [argsArray])`는 첫 번째 인자를 `this`로 하여 배열 형태의 인자로 호출합니다.
- `bind(thisArg)`는 `this`를 고정(fixed)한 새 함수를 반환합니다.
Q7: 이벤트 핸들러 내 `this`는 무엇을 가리키나요?
A: 일반적으로 이벤트가 바인딩된 DOM 요소를 가리킵니다. 단, 화살표 함수를 쓰면 상위 스코프의 `this`를 그대로 가져오므로 다를 수 있습니다.
Q8: `strict mode`에서 `this`의 변경점은 무엇인가요?
A: `strict mode`에서는 함수가 전역 컨텍스트가 아닌 일반 함수로 호출될 때 기본 `this`는 `undefined`가 되므로, 실수로 글로벌 객체를 참조하는 오류를 방지할 수 있습니다.
---
요약
- `this`는 현재 실행 중인 컨텍스트에 따라 가리키는 대상이 바뀌는 특별한 예약어
- 일반 함수 호출 시 전역 객체 또는 `undefined`(`strict mode`)
- 메서드 호출 시 해당 객체
- 화살표 함수는 주변 스코프의 `this` 상속
- 생성자 호출 시 새 인스턴스 객체
- `call`, `apply`, `bind`로 명시적 지정 가능
자바스크립트에서 `this` 키워드는 본질적으로 함수를 어떻게 호출했느냐에 따라 참조 대상이 결정되는 동적인 특성을 갖는 중요한 개념입니다.
`this`는 일반적으로 현재 실행 중인 코드의 컨텍스트를 참조하며, 그 컨텍스트는 함수가 어떻게 호출되었는지에 따라 결정됩니다.
아래에서는 `this`의 다양한 사용 사례와 그 의미를 자세히 설명하겠습니다.
1. 전역 컨텍스트에서의 `this` 전역 컨텍스트에서 `this`는 전역 객체를 참조합니다.
브라우저 환경에서는 `this`가 `window` 객체를 가리키고, Node.js 환경에서는 `global` 객체를 가리킵니다.
```javascript console.log(this); // 브라우저에서는 window 객체를 출력 ```
2. 함수 호출에서의 `this` 일반 함수에서 `this`는 호출된 방식에 따라 다릅니다.
- 일반 함수 호출 : 일반 함수로 호출될 경우, `this`는 전역 객체를 가리킵니다.
그러나 strict mode에서는 `undefined`가 됩니다.
```javascript function showThis() { console.log(this); } showThis(); // 전역 객체 (브라우저에서는 window) ``` - 객체 메서드 호출 : 객체의 메서드로 호출될 경우, `this`는 그 메서드가 속한 객체를 가리킵니다.
```javascript const obj = { name: 'Alice', greet: function() { console.log(`Hello, ${this.name}`); } }; obj.greet(); // Hello, Alice ```
3. 생성자 함수에서의 `this` 생성자 함수에서 `this`는 새로 생성된 객체를 가리킵니다.
`new` 키워드를 사용하여 생성자 함수를 호출하면, `this`는 그 생성된 객체를 참조하게 됩니다.
```javascript function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob ```
4. 화살표 함수에서의 `this` 화살표 함수는 `this`를 자신이 정의된 컨텍스트에서 가져옵니다.
즉, 화살표 함수 내부의 `this`는 외부 함수의 `this`를 참조하게 됩니다.
이는 일반 함수와의 가장 큰 차이점 중 하나입니다.
```javascript const obj = { name: 'Charlie', greet: function() { const arrowFunc = () => { console.log(`Hello, ${this.name}`); }; arrowFunc(); } }; obj.greet(); // Hello, Charlie ```
5. `call`, `apply`, `bind` 메서드 자바스크립트에서는 `call`, `apply`, `bind` 메서드를 사용하여 `this`의 값을 명시적으로 설정할 수 있습니다.
- call : 첫 번째 인자로 `this`로 사용할 객체를 지정하고, 나머지 인자는 함수의 인자로 전달합니다.
```javascript function greet() { console.log(`Hello, ${this.name}`); } const user = { name: 'Dave' }; greet.call(user); // Hello, Dave ``` - apply : `call`과 유사하지만, 두 번째 인자로 배열을 받아서 함수의 인자로 전달합니다.
```javascript function introduce(greeting) { console.log(`${greeting}, ${this.name}`); } const user = { name: 'Eve' }; introduce.apply(user, ['Hi']); // Hi, Eve ``` - bind : 새로운 함수를 생성하고, 그 함수의 `this`를 특정 객체로 고정합니다.
```javascript const user = { name: 'Frank' }; const greetFrank = greet.bind(user); greetFrank(); // Hello, Frank ```
6. `this`와 이벤트 핸들러 DOM 이벤트 핸들러에서 `this`는 이벤트가 발생한 요소를 참조합니다.
그러나 화살표 함수를 사용할 경우, `this`는 외부 컨텍스트를 참조하게 됩니다.
```javascript const button = document.getElementById('myButton'); button.addEventListener('click', function() { console.log(this); // 클릭된 버튼 요소 }); button.addEventListener('click', () => { console.log(this); // 외부 컨텍스트의 this (예: window) }); ``` 결론 자바스크립트에서 `this`는 함수의 호출 방식에 따라 다르게 동작하는 특성을 가지고 있습니다.
이를 이해하는 것은 자바스크립트의 동작 원리를 깊이 이해하는 데 매우 중요합니다.
`this`의 동작 방식은 코드의 흐름과 객체 지향 프로그래밍에서의 메서드 호출에 큰 영향을 미치므로, 개발자는 이를 잘 활용하여 보다 효율적이고 오류 없는 코드를 작성해야 합니다.
작성자:
정유민 [비회원]
| 작성일자: 1년 전
2024-09-10 08:36:56
조회수: 163 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 163 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.