JavaScript

[JavaScript]전역객체 와 this 키워드

vhxpffltm 2019. 5. 27. 23:00

이 내용은 '생활코딩'에서 공부한 내용을 정리한 글이다. 

자세한 내용은 https://www.opentutorials.org/course/743 이곳에서 확인할 수 있다. 

모든 내용의 출처는 이곳이다. 다른 언어를 알고있는 상태로 공부한 내용이다.

 

 

모든 전역변수와 함수는 사실 window 객체의 프로퍼티다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//모든 객체는 전역객체의 프로퍼티이다.
        //함수 앞에 '.'이 있고 그 앞에 객체(window등등)가 있고 '.'뒤의 속성임, 지금은 속성이 함수이다 이를 메소드
        function f() {
            document.write("Hello" + '<br />');
        }
        window.f();
        //함수 앞에 '.'이 있고 그 앞에 객체(window등등)가 있고 '.'뒤의 속성임, 지금은 속성이 함수이다 이를 메소드
        var o = {
            "f"function () {
                document.write("funtion in object" + '<br />');
            }
        }
        o.f();
        window.o.f();// 모두 window객체에 소속된 프로퍼티임을 알자, window를 생략하여 사용
        //자바 스크립트에서는 모든 객체가 전역객체의 프로퍼티임을 알수있다.
 

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//this는 함수내에서 함수 호출 맥락(어떻게 호출하느냐에 따라), 
//객체를 가리킨다 this는 함수안에서 사용할 수 있는 키워드 : arguments
        function ff() {
            if (window == this) document.write("window == this" + '<br />');
        }
        ff();
        //전역객체의 이름인 window와 this라는 변수와 같은지 체크, this는 함수안에서 전역객체를 의미함
        //this : 메소드가 소속되어있는 객체를 가리킴
        var oo = {
            'ff'function () {
                if (oo == this) document.write("o == this" + '<br />');
            }
        }
        oo.ff();
        //여기서 this는 'o'객체를 가리킴, 메소드를 호출하면 메소드가 소속되어 있는 객체를 this로 접근 가능
        // *함수와 메서드의 호출*
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter
 

 

위 예제에서 this는 arguments와 같이 함수에서 내부적으로 사용할 수 있는 키워드이며 메소드가 소속되어 있는 객체를 가리킨다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var f_this = null;
        function f1() {
            f_this = this; // 전역변수인 위의 var을 가리킴 : null로 셋팅
            //생성자로 사용될 떄 this의 값이 생성될 객체를 가리킴
            //함수로 호출하면 this의 값은 window객체를 가리킴
        }
        var o1 = f1(); // 함수를 호츌하면 그 함수는 window객체이므로 window를 가리킬것임
//o1은 생성자가 아니기때문에 undefined
        if (f_this === window) {
            document.write(o1 + ' ' + f_this + '<br />');
            //document.write("Window" + '<br />');
        }
        function Func() {
            document.write(ee + '<br />');
        }
        var ee = new Func();
        //위 문장이 실행되기 전에 변수를 출력하면 undefined이다.
 
        var o2 = new f1(); //new(생성자)를 사용하면 비어있는 객체를 만들고 비어있는 객체가 생성자안에서 this가 됨
        // 실행되기 전까지 객체는 변수에도 할당될 수 없기 때문에 this가 아니면 어떠한 작업을 못함
        // 즉 위 문장이 실행되기 전에 o2는 undefined이다.
        if (f_this === o2) {
            document.write(o2 + ' ' + f_this + '<br />');
            document.write("o2!!!" + '<br />');
        }
        // *생성자의 호출*
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter
 

 

생성자를 통해 호출할때의 중요한점은 실행되기 전까지 객체는 변수에도 할당될 수 없다. -> this가 아니면 어떠한 작업도 할 수 없음을 생각하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var sum2 = new Function('x''y''return x + y;'); 
        // 함수 리터럴 이라함 -> 함수 객체를 만드는것  new를 사용해서 하는것을 리터럴이라 생각
        var num3 = new Array(123);
        document.write(sum2(1,2+ " " + num3 + '<br />');
        var O = {}
        var P = {}
        function F() {
            switch (this) {
                case O:
                    document.write('This is O' + '<br />');
                    break;
                case P:
                    document.write("This is P" + '<br />');
                case window:
                    document.write('Rhis is Window' + '<br />');
                    break;
            }
        }
        F();
        F.apply(O);
        F.apply(P);
        //F는 객체이므로 프로퍼티를 가진다, woindow객체
        //apply(표준 메서드)를 호출할때 인자는 함수 호출 컨텍스트임, 
        //저 함수에서 this의 값은 첫번째 인자로 받은 값이 된다.
        //2,3번쨰 함수호출은  O객체의 메소드가 되고 P객체의 메소드가 된다.
 

위의 예제 실행결과를 판별하고 this가 어떤 객체를 가지게 되는지 이해한다면 this를 이해한것이다.

'JavaScript' 카테고리의 다른 글

[JavaScript]프로토타입_Prototype  (0) 2019.05.29
[JavaScript]상속  (0) 2019.05.29
[JavaScript]생성자와 new  (0) 2019.05.27
[JavaScript] Closure_클로저  (0) 2019.05.27
[Javascript] 함수의 호출(apply)  (0) 2019.05.27