if(!window.AXConfig) { 는 왜 썼을까?
- 모든 변수는 window오브젝트에 등록된다.
- 이미 global객체로 AXConfig가 등록되어있는지 확인하기 위해서 씀.
window객체는 global 객체이기도 하므로, 글로벌 변수로 선언된 모든 변수들은 window객체가 속성으로 가지게 된다.
<script>
var myGlobal = "am i in window?";
alert(myGlobal);
alert(window.myGlobal + " Yes you are!");
</script>
이러한 것을 보게 되면 '이게 뭐?' 라는 생각을 하게 될지도 모르지만, 객체의 속성 접근 방법을 스트링을 인덱스로 하는 배열 접근 방식도 가능하다는 것을 떠올리면 이러한 window 객체의 활용은 그야말로 무궁무진하게 되는 것이다.
<script>
var myGlobal = "am i in window?";
var myVariableName = "myGlobal";
alert(myGlobal);
alert(window.myGlobal + " Yes you are!");
alert(window["myGlobal"] + " Yes you are!");
alert(window[myVariableName] + " Yes you are!");
</script>
여전히 '이게 뭐?' 라고 생각한다면, 흔히들 eval을 이용해서 많이 구현하던, 가변적으로 button들을 설정하기 등과 같은 것을 떠올려보자.
var button1 = document.getElementById("button1");
button1.dosomething = "버튼별로 무언가를 한다. 근데 자꾸 수가 늘어나므로 노가다하기는 싫다ㅠ";
var button2 = document.getElementById("button2");
var button3 = document.getElementById("button3");
var button4 = document.getElementById("button4");
초창기 시절 이러한 질문을 커뮤니티에 올리면 나오는 대답이 'eval을 쓰세요' 였다.
for (var i = 0 ; i < 4 ; i++) {
eval("var button" + i + " = document.getElementById('button" + i + "');";
eval("button" + i + ".dosomething = '이렇게 해도 되지만, eval을 사용했다ㅠ'";
}
하지만 이미 이전에 썼던 글 중에서 'eval is evil'이라는 것을 이전의 글 중에서 썼던 것을 기억한다면 eval을 사용하지 않는 것을 습관으로 들이면 좋을 것이라고 했고, 아직도 이렇게 조언하는 사람이 있다면 그 사람은 그렇게 고급 자바스크립트 개발자는 아니라는 것을 바로 눈치챌 수 있다. 이렇게 eval 없이는 안될 것 같은 것도 window의 이러한 스트링 인덱스를 통한 배열 접근을 한다면 해결이 가능하다.
for (var i = 0 ; i < 4 ; i++) {
window["button" + i] = document.getElementById("button" + i);
window["button" + i].dosomething = "eval 따위 없어도 돼!";
}
사실 이것은 window에 국한 된 것이 아니라 모든 자바스크립트의 객체에 대하여 가능하므로 참고를 하면 좋을 것이다. 이외에도 글로벌 영역에 선언한 함수들도 window객체의 속성으로 접근가능하다.
function myFunction () {
alert("I'm invoked!");
}
window["myFunction"]();
window["myFunction"].call();
이러한 함수명이 없는 함수 리터럴이 아닌 일반 함수로 선언된 함수들도 이러한 식으로 쉽게 접근이 가능하고 변수로 다시 저장이 가능하다는 점은 요긴하게 쓰일 때가 많을 것이다. 글로벌 변수로 선언된 것은 window 객체의 속성으로 들어가기도 하고, 반대로 window 객체의 속성으로 선언된 변수/함수들을 글로벌 변수/함수가 되기도 하므로 양방향으로 필요할 때 요긴하게 사용하면 좋을 것이다.
자바스크립트에서 일반적으로 사용하는 변수들, 값들, 심지어 undefined나 NaN까지 window 객체의 속성들로 기본적으로 들어가있는 것을 보면 재미있을 것이고, 자바스크립트의 구조가 조금 더 이해가 될 것이다.