이 현상을 JavaScript Variable Hoisting이라고 합니다.
어떤 시점에서도 함수의 전역 변수에 액세스하지 않습니다. 당신은 지역 value
변수 에만 접근하고 있습니다.
코드는 다음과 같습니다.
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
아직도 당신이 받고 있다는 게 놀랐 undefined
나요?
설명:
이것은 모든 JavaScript 프로그래머가 조만간 부딪히는 것입니다. 간단히 말해, 선언하는 변수는 항상 로컬 클로저의 맨 위에 올려 집니다. 따라서 첫 번째 console.log
호출 후 변수를 선언 했더라도 그 전에 선언 한 것처럼 간주됩니다.
그러나 선언 부분 만 게양됩니다. 반면에 할당은 그렇지 않습니다.
따라서 처음을 호출 할 때 console.log(value)
아직 할당되지 않은 로컬로 선언 된 변수를 참조하고있었습니다. 따라서 undefined
.
여기 또 다른 예는 :
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
이것이 무엇을 경고 할 것이라고 생각하십니까? 아뇨, 그냥 읽지 말고 생각 해보세요. 의 가치는 test
무엇입니까?
이외의 다른 말을했다면 start
틀린 것입니다. 위의 코드는 다음과 같습니다.
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
전역 변수가 영향을받지 않도록합니다.
보시다시피, 변수 선언을 어디에 두든 상관없이 항상 로컬 클로저의 맨 위에 올려 집니다.
참고 :
이것은 기능에도 적용됩니다.
다음 코드를 고려하십시오 .
test("Won't work!");
test = function(text) { alert(text); }
참조 오류가 발생합니다.
포착되지 않은 ReferenceError : 테스트가 정의되지 않았습니다.
이 코드 는 잘 작동하기 때문에 많은 개발자를 방해합니다.
test("Works!");
function test(text) { alert(text); }
그 이유는 명시된 바와 같이 할당 부분이 들어 올려 지지 않았기 때문 입니다. 따라서 첫 번째 예제에서 test("Won't work!")
실행 되었을 때 test
변수는 이미 선언되었지만 아직 함수가 할당되지 않았습니다.
두 번째 예에서는 변수 할당을 사용하지 않습니다. 오히려, 우리는 적절한 함수 선언 구문, 사용하고있는 않는 완전히 빠진 기능을 얻을 수 있습니다.
Ben Cherry 는 이에 대해 JavaScript Scoping and Hoisting 이라는 제목의 훌륭한 기사를 작성했습니다 .
읽어. 전체 그림을 자세하게 보여줍니다.