[JavaScript] this


this


vo.) context: 의미가 고정적이지 않고 그것을 사용하는 상황에 따라 의미가 달라질수 있다. 가변적이다

this는 함수 내에서 함수 호출 맥락(context)를 의미한다. 맥락이라는 것은 상황에 따라서 달라진다는 의미인데 즉 함수를 어떻게 호출하느냐에 따라서 this가 가리키는 대상이 달라진다는 뜻이다. 

함수와 객체의 관계가 느슨한 자바스크립트에서 this는 이 둘을 연결시켜주는 실질적인 연결점의 역할을 한다.

this는 함수 안에서 사용할 수 있는 일종의 변수이면서 그 변수안에 값은 그 함수를 어떻게 호출하느냐에 따라서 달라진다.


1. 함수호출

함수를 호출했을 때 this는 무엇을 가르키는지 살펴보자. this는 전역객체인 window와 같다.

function func(){

    if(window === this){//"==="--> 정확하게 같은지 체크한다.

        document.write("window === this");

    }

}

func(); 

결과) 

window === this


cp.) 최상위 this

var abc = "Kim";

     window.def = " HJ";

     console.log(this.abc + "+" + this.def);

(function(){

console.log(this.abc + "+" + this.def);

})();

실행결과)

Kim+ HJ

Kim+ HJ


2. 메소드의 호출

객체의 소속인 메소드의 this는 그 객체를 가르킨다. 

var o = {

    func : function(){

        if(o === this){

            document.write("o === this");

        }

    }

}

o.func();   

결과)

o === this

이것을 통해 우리가 알 수 있는 것은 어떠한 객체안의 메소드에서 메소드를 호출하면 메소드가 소속되어 있는 객체를 this로 접근할 수 있다.


3. 생성자의 호출

아래 코드는 함수를 호출했을 때와 new를 이용해서 생성자를 호출했을 때의 차이를 보여준다.

함수 안에서 this라는 키워드는 그 함수가 소속되어 있는 객체를 가리킨다.

---> 이것이 기본 원칙이다. 그 함수가 누구의 소속(객체)이냐에 따라서 this의 값은 그 객체(소속)의 값을 가리킨다.

var funcThis = null; 

 

function Func(){ 

    funcThis = this;// var이 없으므로 전역 변수인 funcThis이다.--->this는 window

}

var o1 = Func();// Func는 일반함수이다.함수안에서의 this는 window를 가리킨다.

if(funcThis === window){

    document.write('window </br>');

}

 

var o2 = new Func();//비어있는 객체를 만들고 그 비어있는 만들어진 객체가 생성자 안에 this가 된다(this는 생성된 객체를 가리킨다.). new를 통해 호출했으므로 Func는 생성자이다. -->this는 o2

if(funcThis === o2){

    document.write('o2 </br>');

}

결과)

window 

o2


생성자는 빈 객체를 만든다. 그리고 이 객체내에서 this는 만들어진 객체를 가르킨다. 이것은 매우 중요한 사실이다. 

생성자가 실행되기 전까지는 객체는 변수에도 할당될 수 없기 때문에 this가 아니면 객체에 대한 어떠한 작업을 할 수 없기 때문이다. -->undefined

function Func(){

    document.write(o);

}

var o = new Func();

결과)

undefined


cp.) 생성자 this

var Abc = function Abc(msg) {

this.abc = msg;

this.method = function () {

console.log("method+" + this.abc);

}

}


var obj1 = new Abc("Hello");

var obj2 = new Abc("World");


// Hello 표시

console.log(obj1.abc);

// method+Hello 표시

obj1.method();


// World 표시

console.log(obj2.abc);

// method+World 표시

obj2.method();


// new를 안붙였기 때문에 Abc내 this는 전역 객체임

Abc("new가없음");

console.log(window.abc == "new가없음");

// method+new가없음!

window.method();

실행결과)

Hello

method+Hello

World

method+World

true

method+new가없음


4. 어떤 것에 소속된 this

소속된 개체를 가리킵니다.

var abc = {def:"HJ"};

abc.print1 = function() {

console.log(this.def);

};


// HJ 표시

abc.print1();


var func = function() {

console.log(this.def);

};

// window.def가 참조되어 undefined

func();


abc.print2 = func;

// this가 abc로 변경되어 HJ 표시

abc.print2();


// prototype시도

var Abc = function Abc(msg) {

this.message = msg;

};

Abc.prototype.print = function() {

console.log("prototype+" + this.message);

}

var obj = new Abc("Hello");

// prototype+Hello 표시

obj.print();

실행결과)

HJ

undefined

HJ

prototype+Hello


4. apply, call

함수의 메소드인 apply, call을 이용하면 this의 값을 제어할 수 있다. 

cf.) 함수도 객체이다.

var o = {}

var p = {}

function func(){

    switch(this){

        case o:

            document.write('o<br />');

            break;

        case p:

            document.write('p<br />');

            break;

        case window:

            document.write('window<br />');

            break;          

    }

}

func();

func.apply(o);

func.apply(p);

결과)

window

o

p

자바스크립트에서 함수는 일반적인 객체지향언어의 메소드보다 위상이 높다.(객체에 종속적이지 않다.) 

그럼에도 불구하고 함수를 어떻게 호출하느냐에 따라서 맥락적으로 함수는 어떠한 객체에 종속될 수도 있다.

this는 맥락에 따라 달라진다.


cf.) var o { }: 객체리터럴/ var o =new Object();

      var a =[1,2,3]/ var new Array(1,2,3)


'WebFont-end > JavaScript' 카테고리의 다른 글

[JavaScript] prototype  (0) 2014.12.07
[JavaScript] 상속  (0) 2014.12.07
[JavaScript] 생성자와 new  (0) 2014.12.07
[JavaScript] 함수의 호출  (0) 2014.12.07
[JavaScript] 콜백  (0) 2014.12.07