자바스크립트 호이스팅
델파이나 c#을 공부하고 이용할 땐 특별히 문제되지 않았던 호이스팅이 자바스크립트 공부를 하니 큰 비중으로 설명된다. 좀 어리둥절하고 이게 뭐 그리 대순가 싶다.
function TestFunction()
{
console.log(_String);
var _String = 'abcde';
}
TestFunction(); // undefined
저런 머저리 같은 코드를 도대체 누가 작성한다고 저걸 설명하느라 몇 패이지씩 낭비를 한다. 참고로 위 코드는 변수가 호이스팅되어 정상 작동한다. 변수가 호출되는 코드의 뒤에 그 변수가 선언되어 있어도 변수가 호출될 때 선언된 것으로 처리가 되기 때문이다. 이걸 hoist한다고 한다. ‘끌어올린다’는 뜻이다.
물론 델파이나 c#의 경우에도 호이스팅은 된다. 하지만 제한적이어서 위와 같은 무지막지한 코드는 허용되지 않는다. 굳이 저런 코드를 가능하게 하지 않아도 상식적으로 코딩을 하면 문제될 게 없다.
자바스크립트는 여러 변칙적 상황에서 실행이 멈추질 않고 그냥 뭉개고 지나간다. 이러한 특성은 정교하게 학습을 하지 못한 프로그래머의 실수를 보완하지만 엉뚱한 결과를 내기도 한다. 공부를 하다 보니 교재의 상당 부분이 이러한 호이스팅이나 묵시적 타입캐스팅 설명에 할애되어 있어 안타깝다. 이렇게 구구절절 설명을 할 필요 없이 그저 선언을 하고 값을 넣고 호출을 하면 되는데 이게 뭐 그리 어렵다고 순서를 뒤죽박죽으로 하는지 이해하기가 어렵다. 전통적이고 상습적인 습관이 생산성을 떨어트리는 것도 아니다. 오히려 자바스크립트의 이런 특성이 성능을 저하한다.
참고로 위 코드에서 변수가 호출된 때 선언만 된 상태이므로 abcde는 출력되지 않는다. 자바스크립트에서 변수는 전역/지역 여부를 묻지 않고 선언된 때 모두 쓰레기 값 아닌 undefined라는 독특한 값을 갖는다.