본문 바로가기
일상정보

자바스크립트에서 this 키워드의 활용 방법과 주의점

by ldadinhooain 2024. 4. 5.

- this 키워드의 개념 이해

 

--this-키워드의-개념-이해

 

 

### this 키워드의 개념 이해

 

자바스크립트에서 this는 함수가 어떻게 호출되는지에 따라 그 의미가 달라집니다. 주로 다음과 같이 동작합니다.

 

1. **전역 컨텍스트에서의 this**: 브라우저 환경에서 전역에서 this는 전역 객체를 가리킵니다. 브라우저에서는 window 객체가 전역 객체이므로 this는 window를 가리킵니다.

 

2. **함수 내부에서의 this**: 일반 함수 내부에서 this는 함수 호출 방식에 따라 다르게 동작합니다. 일반 함수에서는 this는 전역 객체(window)를 가리키지만, strict mode에서는 undefined를 가리킵니다.

 

3. **메소드 내부에서의 this**: 객체의 메소드 내부에서 this는 해당 메소드가 속한 객체를 가리킵니다.

 

4. **생성자 함수 내부에서의 this**: 생성자 함수에서 this는 새로 생성되는 객체를 가리킵니다.

 

이러한 개념을 이해하고, this를 적절히 활용하면 코드를 더 유연하고 간결하게 작성할 수 있습니다. 주의할 점은 this는 실행 시점에 따라 동적으로 결정되므로, 올바른 시점에 올바르게 사용해야 합니다.

 

 

 

- 명시적으로 this 바인딩하는 방법

 

--명시적으로-this-바인딩하는-방법

 

 

명시적으로 this 바인딩하는 방법은 다음과 같습니다:

 

1. **call 메소드를 사용하는 방법:**

 

- call 메소드를 사용하여 특정 함수를 호출하면서 this로 사용할 객체를 명시적으로 지정할 수 있습니다.

 

- 예시:

 

```javascript

 

function greet() {

 

return `Hello, ${this.name}!`;

 

}

 

const person = { name: "Alice" };

 

const result = greet.call(person);

 

console.log(result); // 출력: "Hello, Alice!"

 

```

 

2. **apply 메소드를 사용하는 방법:**

 

- apply 메소드를 호출할 때 호출하고자 하는 함수에 배열 형태로 전달하면서 this로 사용할 객체를 명시적으로 지정할 수 있습니다.

 

- 예시:

 

```javascript

 

function introduce(greeting) {

 

return `${greeting}, my name is ${this.name}.`;

 

}

 

const person = { name: "Bob" };

 

const result = introduce.apply(person, ["Hi"]);

 

console.log(result); // 출력: "Hi, my name is Bob."

 

```

 

3. **bind 메소드를 사용하는 방법:**

 

- bind 메소드를 사용하여 특정 함수에 this로 사용할 객체를 영구적으로 바인딩할 수 있습니다.

 

- bind 메소드는 호출하지 않고 새로운 함수를 반환합니다.

 

- 예시:

 

```javascript

 

function say() {

 

return `I am ${this.job}.`;

 

}

 

const person = { job: "a developer" };

 

const sayFunction = say.bind(person);

 

console.log(sayFunction()); // 출력: "I am a developer."

 

```

 

이러한 명시적 바인딩 방법을 사용하여 this 키워드를 활용할 때 주의해야 할 점은 주어진 객체의 스코프나 범위를 잘 이해하여 올바르게 사용해야 한다는 것입니다. 부적절한 바인딩은 예상치 못한 동작을 유발할 수 있으므로 주의가 필요합니다.

 

 

 

- 암시적으로 this 사용하는 방법

 

--암시적으로-this-사용하는-방법

 

 

[- 암시적으로 this 사용하는 방법]

 

자바스크립트에서 함수를 정의하고 호출할 때, this 키워드는 함수가 호출될 때 결정됩니다. 이때 암시적으로 this를 사용하여 현재 함수 내의 객체에 접근하는 방법이 있습니다.

 

1. **메소드 내에서의 this 사용**

 

객체의 메소드 내에서 this를 사용하면 해당 메소드가 속한 객체를 가리킵니다.

 

```javascript

 

const person = {

 

name: "Alice",

 

greet: function() {

 

console.log(`Hello, I"m ${this.name}.`);

 

}

 

};

 

person.greet(); // 출력: Hello, I"m Alice.

 

```

 

2. **이벤트 핸들러에서의 this 사용**

 

이벤트 핸들러 함수 내에서 this를 사용하면 해당 이벤트를 발생시킨 요소를 가리킵니다.

 

```javascript

 

const button = document.querySelector("button");

 

button.addEventListener("click", function() {

 

console.log(`Button ${this.textContent} clicked.`);

 

});

 

```

 

3. **생성자 함수 내에서의 this 사용**

 

생성자 함수 내에서 this를 사용하여 새로운 인스턴스를 가리킬 수 있습니다.

 

```javascript

 

function Person(name) {

 

this.name = name;

 

this.greet = function() {

 

console.log(`Hello, I"m ${this.name}.`);

 

};

 

}

 

const person1 = new Person("Bob");

 

person1.greet(); // 출력: Hello, I"m Bob.

 

```

 

주의해야 할 점은 화살표 함수를 사용할 때, this가 정적으로 바인딩되어 외부 스코프의 this를 상속받는다는 것입니다. 이 때는 암시적으로 this를 사용할 수 없으므로 일반 함수를 사용해야 합니다.

 

 

 

- this를 올바르게 활용하는 팁

 

--this를-올바르게-활용하는-팁

 

 

this를 올바르게 활용하는 팁은 다음과 같습니다.

 

1. 함수 내에서 this를 사용할 때는 함수를 호출하는 방법에 따라 this가 가리키는 대상이 달라집니다. 주로 화살표 함수와 일반 함수의 차이점을 이해하는 것이 중요합니다.

 

2. 메서드 내부에서의 this는 메서드가 속한 객체를 가리킵니다. 메서드가 속한 객체를 가리키기 위해서는 함수를 정의할 때 function 키워드를 사용해야 합니다.

 

3. 생성자 함수 내부에서의 this는 새로 생성되는 객체를 가리킵니다. 이를 활용하여 동적으로 객체를 생성하고 속성을 추가할 수 있습니다.

 

4. call, apply, bind 메서드를 활용하여 this가 가리키는 대상을 명시적으로 지정할 수 있습니다. 특히 bind를 사용하면 this를 고정시킬 수 있어 편리합니다.

 

이러한 팁들을 숙지하여 자바스크립트에서 this 키워드를 올바르게 활용하면 코드를 더욱 효율적으로 작성할 수 있습니다.

 

 

 

- 주의해야 할 this 키워드 사용 상황

 

--주의해야-할-this-키워드

 

 

## 주의해야 할 this 키워드 사용 상황

 

1. **화살표 함수와 일반 함수의 차이**: 화살표 함수 내에서 this 키워드는 함수가 정의된 시점의 상위 스코프의 this 값을 참조한다. 일반 함수에서의 this와는 다르게 동작하기 때문에 주의가 필요하다.

 

2. **콜백 함수에서의 this**: 콜백 함수 내에서의 this는 그 콜백이 어디서 호출되었느냐에 따라 의도하지 않은 값을 가리킬 수 있다. 이때, bind, apply, call 등을 이용하여 명시적으로 this를 설정해주는 것이 좋다.

 

3. **클래스 메서드에서의 this**: 클래스 내부의 메서드에서 this를 사용할 때, 해당 메서드를 다른 변수에 할당한 뒤 호출하면 this가 원하는 대상을 가리키지 않을 수 있다. 이때는 화살표 함수를 사용하거나 bind 메서드를 활용하여 명확히 this를 설정해주어야 한다.

 

4. **이벤트 핸들러에서의 this**: 이벤트 리스너 함수 내에서의 this는 이벤트가 발생한 DOM 요소를 가리키기 때문에, 원하는 객체를 가리키도록 하려면 bind 메서드나 화살표 함수를 사용하여 this를 명시적으로 설정해주어야 한다.

 

this 키워드의 활용은 매우 유용하지만, 예기치 않은 동작을 일으킬 수 있는 위험성도 함께 고려해야 한다. 주의 깊은 사용이 필요하다.