이 내용은 '생활코딩'에서 공부한 내용을 정리한 글이다.
자세한 내용은 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 />');
}
}
//여기서 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(1, 2, 3);
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 |