# 일반적인 함수 생성과 호출( this 와 var의 차이점 )
다음과 같이 일반적인 함수가 생성되어있다.
function Action(data){
var a = data;
this.b =data;
var aa = function(){
alert("함수 : "+data);
}
this.bb= function(){
alert("함수 : "+data);
}
alert(a);
alert(b);
}
이 함수를 호출하는방법은 바로 함수명으로 호출하는방법이 있다.
이는 함수를 호출한 시점에 해당함수를 순차적으로 실행한다.
따라서 맨마지막 alert()작업을 할 것이다.
또한 Action함수를 실행시 실행시점에 window객체에 this로선언된 b와 bb 두 속성이 추가된다.
따라서 Action함수호출다음 내부 this로 선언된 속성은 어디서든 접근가능하다!
( var로 선언된것은 범위가 함수 내부이므로 내부에서 자기들끼리 사용가능 )
( 단 var로 선언된 값을 return으로 외부로 돌려주는식으로는 사용가능 )
Action(123); // 123
// 123
다음은 123 123 을 내부 alert에 의해 수행하지만 a, b, aa(), bb() 는 못찾는다.(접근불가!!)
단지 함수호출에 대한 순차적인 일만 할 뿐이다.
Action(123).a
Action(123).b
Action(123).aa()
다음은 this로 선언된 속성이라 위 Action(123); 함수 호출시점에 window객체에 추가된다.
alert( b ); // 123
bb(); // 함수 : 123
또다른 함수 호출방법은 함수를 객체화 시켜서 호출 하는방법이다.
자바와같이 new 키워드를 사용하는것이다.
alert( typeof Action); -- function
var obj = new Action();
alert( typeof obj) -- Object
이는 함수를 객체화시켜서 마치 자바의 메소드처럼 사용가능하다
따라서 함수내부에 선언된 this키워드는 생성된 객체의것이다.
따라서 객체명으로 this키워드에 외부에서 접근가능하다!!!
( 여전히 함수내부 var로 선언된 속성은 외부에서 접근 불가능하다!! 내부에서만 사용가능 )
( 여전히 내부에서 var값을 return으로 외부로 돌려준다면 사용가능 )
var obj = new Action(32); // 32 출력
// 내부 alert(b)에서 b는 찾지 못한다.( 에러가나면서 멈춤 )
// 객체 생성방식으로 접근시
// this요소에는 외부에서 접근가능
// var요소에는 외부에서 접근 불가능!
alert( obj.b ); // 32출력
alert( obj.a ); // undefined
obj.aa(); // 마찬가지로 var로 선언되어서 접근불가
결론은 함수를 호출시 내부 this로 선언된변수나 내부함수들은
호출시점에 window객체에 추가되고
함수를 그냥 호출하지않고 객체화시킨다면 내부 this로 선언된 속성은 window객체가 아닌
생성된 새로운객체의 속성에 추가된다!
function Jo(){
return this;
}
var a = Jo();
alert( a instanceof Window ); // true
var b = new Jo();
alert( b instanceof Jo); // true