this

javascript 2017.12.11 23:53

자바스크립트 this


this 는 일반적으로 메서드를 호출한 객체가 저장되어 있는 속성




콘솔 찍어보기 전까지 예상하기 어려운 녀석이네요.

코딩을 하면서 조금씩 움찔움찔 합니다. 어... 이게 이걸 가르키나 하구요.



일반 함수에서의 this

1
2
3
function a() {
    console.log(this);
}
cs

a 함수를 호출하기 전에 this가 무엇인지 생각해 봅시다.

.

.

.

.

.

예상하신게 이 다음 적을 결과와 같다면 아마 this를 이미 잘 아시는 분이실꺼 같습니다.


저는 자바스크립트 에서의 this 는 많이 공부해야 하지만 얕게 알고있는 내용이라도 몇자 남겨 보겠습니다.

자바스크립트의 this만 하더라도 책한권의 분량이 나온다고 하니 많이 공부가 필요할듯싶습니다.

이 글에서 전달하고자 하는 부분이 잘못되어 있으면 지적 부탁드립니다.

후에 명확한 내용을 전달할 수 있을때 다시 포스팅 하겠습니다.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

결과


일반 함수에서의 this 는 window 객체를 가르키고 있습니다.

여기서 알 수 있는 사실은

- this 는 무조건 '객체' 입니다.







그리고 좀 더 명확하게 알기 위해서는 '함수를 호출한 시점'을 알아야 합니다.

윗 사진에 있는 window 객체를 펼쳐보면 a 라는 함수가 보입니다.


이렇다는건 다음과 같은 코드로도 a 라는 함수를 호출할 수 있습니다.

1
window.a();
cs



같은 결과가 나오고 있네요.

두번째로 알 수 있는건 이렇게 호출한 시점의 '객체' 가 this 가 됩니다.


예제 1)

1
2
3
4
5
6
7
8
9
var num = 0;
function a() {
    this.num = 99;
    num = 70;
 
    console.log(num);
    console.log(this.num);
    console.log(window.num);
}
cs


- 3번 코드에 의해 전역변수 num 에 99가 할당.

- 4번 코드의 num 은 지역변수 num을 일단 찾고 없으면 전역에서 변수 num을 찾음 전역변수 num 이 있으므로 전역변수 num 에 70을 할당.

- 6,7,8번 코드 모두 전역변수 num을 가르키므로 셋다 70이 출력



그럼 예제의 3번 코드와 4번 코드 사이에

지역변수 num 을 넣어보겠습니다.


예제 2)

1
2
3
4
5
6
7
8
9
10
var num = 0;
function a() {
    this.num = 99;
    var num = 25;
    num = 70;
 
    console.log(num);
    console.log(this.num);
    console.log(window.num);
}
cs


- 3번 코드에 의해 전역변수 num 에 99 가 할당

- 4번 코드 에 의해 a 함수 안에 지역변수 num 이 25 라는 값을 가짐

- 5번 코드에 의해 a 함수 안의 지역변수 num 에 70 라는 값이 담김

- 7번 에서의 num 은 함수 내부의 지역변수를 num을 찾음 // 70

- 8번 에서의 this.num 은 a라는 함수를 호출한 window 객체의 num(전역변수) 을 찾음 // 99

- 9번 에서의 window.num 은 전역변수 num 을 가르킴. // 99










일반 중첩 함수에서의 this


다음의 코드를 한번 예상해 봅시다.


예제 3)

1
2
3
4
5
6
function a() {
    function b() {
        console.log(this);
    }
    b();
}
cs


이 예제도 this 가 무엇을 가르키는지 맞추셨다면 this 를 이미 잘 아시는 분이실듯 합니다.

.

.

.

자바스크립트를 이제 막 접하신 분들이라면 위의 예제를 해보고 난 뒤 b 함수가 호출되는 시점을 찾았을 것이라 생각됩니다.

b 함수는 a 함수 안에서 실행이 되니깐 아마 예상하기론 a 함수가 찍혀있지 않을까 예상실꺼 같다고 생각이 듭니다.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

일단 b 함수를 호출해 보기 위해 첫번째 시도를 하겠습니다.

이 사진에서 보시다시피 b 함수는 a 라는 함수 내부에 있기 때문에 그냥 b 함수를 호출 못시킴니다.




따라서 a라는 함수를 호출해야지 a 함수 내부의 동작을 수행하면서 b 함수가 호출이 됩니다.

그런데 잘 보시면 a 함수가 콘솔로 찍혀 있을 줄 알았지만 예상과는 다르게 window 객체가 찍혀져 있었네요.


이 예제에서는 중첩함수 내부에 있는 this 는 window 객체를 의미합니다.







※ 그럼 함수는 객체인가요?

함수도 객체 입니다. 1급 객체

함수도 객체처럼 프로퍼티를 가질 수 있기 때문.

(이 포스팅 에서는 this 를 다루고 있기 때문에 함수는 다음에 포스팅 하겠습니다.)


'javascript' 카테고리의 다른 글

[번역]ES6 축약코딩 기법  (0) 2018.09.04
console log Style (콘솔로그 스타일)  (0) 2018.06.12
this  (0) 2017.12.11
먹고싸고 객체  (0) 2017.11.23
깐깐하게 생각해보는 js 초 기초  (0) 2017.11.21
[용어] 클래스, 인스턴스, 객체, 프로퍼티, 메서드  (0) 2017.09.24

댓글 0