이것이 포인트 추가에 접근하는 잘못된 방법이라면 저를 용서하십시오. 나는 여기에 많이 가본 적이 없으며 건설적인 지시 및 / 또는 비판을 환영 할 것입니다.
Benjamin의 답변은 OP의 질문을 훌륭하게 다루지 만, 호이 스팅과 그 이상한 점에 대한 전체 둘러보기를 제공하는 하나의 조정을 추가하고 싶습니다.
다음과 같이를 호출하여 원래 코드를 시작하면 f
:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
출력은 다음과 같습니다.
Me duplicate.
Me original.
그 이유는 그 var
와 function
진술이 약간 다른 방식으로 게양되기 때문입니다.
들어 선언 현재 범위의 *의 상단으로 이동하지만, 어떤 과제가 게양되지 않습니다. 선언 된 var의 값이가는 한 원래 할당 줄에 도달 할 때까지 정의되지 않습니다.var
들어 function
문 , 선언 모두 와 정의가 게양된다. 구조에 사용 된 함수 표현식var f = function() {...
은 호이스트되지 않습니다.
따라서 호이 스팅 후 실행은 코드가 다음과 같습니다.
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
* 모든 JavaScript 범위는 어휘 또는 기능, 범위이지만 그 시점에서 f 단어를 사용하면 혼란 스러울 것 같았습니다.