호이스트(Hoist: 끌어 올리다)현상
현재 영역(Scope)의 최상단으로 변수 이름 또는 함수 선언문이 끌어올려지는 것을 말한다.
1. 변수 범위 (Variable Scope)
변수 범위는 변수가 존재하는 컨텍스트이다. 이것은 어디에서 변수에 접근할 수 있는지, 그 컨텍스트에서 변수에 접근할 수 있는지를 명시적으로 나타낸다.
변수는 지역 범위(local scope)와 전역 범위(global scope) 둘 중 하나를 가진다.
1-1. 지역 변수 (함수 수준 범위)
대부분의 프로그래밍 언어와 달리, 자바스크립트는 블럭-수준(block-level)의 범위를 가지고 있지는 않다. 대신, 자바스크립트는 함수-수준(function-level)의 범위를 가진다. 함수내에 정의된 변수는 지역 범위를 가지며, 해당 함수와 내부 함수에서만 접근이 가능하다.
변수 정의시 var 를 사용하는것이 좋은데 왜냐면 var를 쓰지 않을 경우 암묵적으로 전역객체에 변수를 만들기 때문!
정확히 전역객체에 속성을 만들기 때문에 오류가 생길 가능성이 크다.
지역번수는 함수내에서 전역번수보다 높은 우선순위를 가지게 되는데
만약, 같은 이름의 전역변수와 지역변수가 존재할 경우 이 변수를 함수내에서 사용한다면, 지역변수가 우선권을 갖게 된다.
1-2. 전역 변수
함수의 외부에서 선언된 모든 변수는 전역 범위(global scope)를 가진다. 브라우저에서, 전역 컨텍스트(또는 scope)는 window 객체를 가리킨다.
그러므로, 전역변수는 전체 어플리케이션에서 사용이 가능하다.
모든, 전역 변수는 window객체와 연결이 된다. 그러므로, 아래와 같이 window객체를 통해 모든 전역 변수에 접근이 가능하다.
만약, 변수가 최초 선언 없이(var 키워드를 사용하여) 초기화 되었다면, 이 변수는 자동으로 전역 컨텍스트에 추가 된다.
아래의 firtName은 둘다 전역 범위이다. 두번째, firstName은 {} 블럭으로 쌓여있지만, 자바 스크립트는 블럭단위 범위를 지원하지 않는다는 것을 기억하자.
setTimeout 변수는 전역 범위에서 실행된다.
setTimeout 안에서 선언된 모든 함수는 전역 범위에서 실행됩니다. 다음 예제를 주의해서 보자.
전역 범위를 오염시켜서는 안된다. 가급적 전역 범위에 변수를 생성하는것을 피하도록 하자.
2. 변수 호이스팅(Variable Hoisting)
모든 변수선언은 호이스트 된다.
호이스트란, 변수의 정의가 그 범위에 따라 선언과 할당으로 분리되는 것을 의미한다. 즉, 변수가 함수내에서 정의되었을 경우 선언이 함수의 최상위로, 함수 바깥에서 정의되었을 경우는 전역 컨텍스트의 최상위로 변경된다.
변수의 선언이 초기화나 할당시에 발생하는것이 아니라, 최상위로 호이스트 된다는 것!
호이스트 되었을때, 함수 선언은 변수선언을 덮어 쓴다.
“strict mode”에서 최초의 선언없이 변수에 값을 할당하려 한다면 오류가 발생한다. 변수에 값을 할당 하려 할때는 항상 미리 선언하는 습관을 들이자.
Comments