모든 객체, 모든 함수, 모든 변수는 전역 객체의 property(속성)이다.
호스트 환경에 따라 이름이 다르다.
함수 내에서 함수 호출 맥락의 의미한다.
this의 본질을 그 함수가 속해 있는 객체를 가리킨다는 것이다.
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
function func(){ //전역객체에 함수 func 정의
if(window === this){ //this가 전역객체를 가리킨다면
alert("window === this");
}
}
func(); //출력 : window === this
//this는 window를 가리킨다는 것을 알 수 있다.
</script>
</body>
</html>
이 경우도 사실 함수가 전역객체에 소속되어 있는 것이기에 window를 가리키는 것이다.
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
var object = { //객체 정의
func : function(){ //객체 안에 fun라는 함수 정의
if(object === this){
alert("object === this");
}
}
}
object.func(); //출력 : object === this
//func함수가 object 객체에 속해 있기 때문에 this는 object객체를 가리킨다.
</script>
</body>
</html>
생성자가 실행되기 전까지는 객체는 변수에도 할당될 수 없기 때문에 this를 사용하여 생길 객체를 가리켜 사용하고 싶은 기능을 만들 수 있다. 이 때 this는 필수적으로 쓰이는 것이다.
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
function conductor(input){ //생성자 함수를 만든다. 매개변수는 input
this.name = input; //생성될 객체를 이름을 모르기 때문에 this를 사용하여 생성될 객체의 name에 input값을 넣어준다.
}
var object = new conductor('code'); //new와 생성자를 통하여 object 이름의 객체를 만들어주고 인수로 초기화해준다.
alert(object.name); //출력 : code
//생성자를 만들 때 만들 객체의 이름을 모르기 때문에 this를 사용하여 생성자의 기능을 구현한다.
</script>
</body>
</html>
함수.apply(객체 a)의 형태는 객체.함수()로 해석할 수 있기 때문에 apply를 사용하면 함수 안에 있는 this는 객체 a를 가리키게 된다.
함수.apply(객체) == 객체.함수( )
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
var o = {} //o 객체 선언
var p = {} //p 객체 선언
function func(){
switch(this){ //this에 따라 기능 변화
case o:
document.write('o<br />');
break;
case p:
document.write('p<br />');
break;
case window:
document.write('window<br />');
break;
}
}
func(); //출력 : window
func.apply(o); //출력 : o
func.apply(p); //출력 : p
</script>
</body>
</html>
JavaScript에서의 함수는 일반적인 객체 지향 언어에서의 함수(메소드)보다 위상이 높아 함수가 반드시 어디에 고정적으로 종속해 있는 것이 아니라 함수를 어떻게 호출하느냐에 따라 맥락적으로 서로 다른 객체에 종속될 수 있다.