자바스크립트는 함수 선언도 hoisting 기능이 적용된다.

다음 예를 보자.



//전역 함수 선언
function foo1() {
	alert('global foo1');
}
function foo2() {
	alert('global foo2');
}
function hoistMe() {
	foo1();
	foo2();

	function foo1() {
		alert('local foo1');
	}
	var foo2 = function() {
		alert('local foo2');
	}
}
hoistMe();

결과는 어떻게 될까......


의도된 결과는

'global foo1'

'global foo2'

였을 것이다.


하지만 자바스크립트의 hoisting 기능으로 인해 결과는

'local foo1'

Type Error


가 된다.


어째서?


자바스크립트는 hoistMe() 함수 내부에 선언된 변수 및 함수를 hoisting 하는데

foo1()은 함수 선언이므로 함수 정의 자체도 같이 hoisting되어서

전역 foo1() 함수를 가린다.


따라서 호출 결과 global이 아닌 local 이 불리게 되는것이다.



그럼 왜 foo2는 global도 local도 아닌 Type error 일까?


foo2()는 hoistMe 함수 내부에서 함수표현식으로 함수를 정의 했다.

hoist 기능은 선언문만 유효범위 맨 위로 올려지기 때문에

var foo2; 만 hoisting되고 함수 정의는 그 위치 그대로 남게 된다.


따라서 foo2()를 호출 하였을 때엔 

var foo2; 는 선언이 되어있지만 정의가 안된 undefined 값이어서,

즉 foo2라는 객체가 isCallerble이 아니기 때문에 Type Error 예외를 발생시킨다.



local 안에서 새로 정의한 함수를 호출 할 의도였으면

함수 선언문으로 선언을 하자.


'WEB > javascript' 카테고리의 다른 글

javascript JSON 사용하기  (0) 2012.08.10
자바스크립트 콜백과 유효범위  (0) 2012.07.27
자바스크립트 함수 객체의 name 프로퍼티  (0) 2012.07.27
생성자 함수 안전 사용  (0) 2012.07.22
객체 생성자의 함정  (0) 2012.07.22
myname = "global";
function func() {
	alert(myname);
	var myname = "local";
	alert(myname);
}
func();


의도된 결과는




였을 것이다.


하지만. 자바스크립트에는 hoisting이라는 성질이 있다.


myname = "global";
function func() {
var myname;            // undefined
alert(myname);
myname = "local";
alert(myname);
}
func();



myname 라는 변수의 선언이 scope의 맨 위로 올려져 undefined 값으로 설정된다.


따라서 결과는







'WEB > javascript' 카테고리의 다른 글

자바스크립트 리터럴 표기법  (0) 2012.07.22
eval() 안전하게 사용하는 방법  (0) 2012.07.22
자바스크립트 전역변수  (0) 2012.07.10
strict mode  (0) 2012.07.10
객체지향 언어  (0) 2012.07.09

+ Recent posts