2017-04-19 5 views
0

책 있음 You Don't Know JS: Scope & Closures이 코드 샘플은 완전히 이해할 수 없습니다.조건부 함수 선언

"일반적으로 오히려이 코드에서 알 수 있듯이 조건부 것보다, 클로징 범위에 게양 정상 블록 안에 표시 기능 선언은"

foo(); // "b" 

var a = true; 
if (a) { 
    function foo() { console.log("a"); } 
} 
else { 
    function foo() { console.log("b"); } 
} 

그것은 무엇을 의미 하는가? 그것은 어떻게 가능한가? 조건부가 작동하지 않습니까?

+1

인용문이 잘못되었습니다. – RobG

+1

* "무엇을 의미합니까?"* 함수 선언은 다른 모든 곳과 마찬가지로 호이스트됨을 의미합니다. * "조건부가 작동하지 않습니까?"* 작동하지만 코드가 실행되기 전에 호이스트가 발생합니다. 실제로 블록 내에서 함수 * 선언 *이 실제로 유효하지 않기 때문에 실제로는 더 복잡합니다. 그러나 브라우저는이를 허용하고 다른 동작을 구현합니다. [다른 브라우저에서 함수 선언이 다르게 처리되는 이유는 무엇입니까?] (http://stackoverflow.com/q/8871974/218196) –

+0

'var a = true; const foo = a?() => console.log ('a') :() => console.log ('b'); foo();'그런 다음 콘솔은'foo '가 게양되지 않기 때문에'a '를 로깅합니다. – Josep

답변

0

함수 선언이 javascript 파서에 의해 파일의 맨 위로 이동 되었기 때문에 상황이 발생합니다. 저것은 그들이 감기에 의하여 의미하는 무슨이다. 마지막 선언이 foo 인 경우 처음 끌 때 덮어 쓰기됩니다.

+1

설명이 잘못되었습니다. 함수 선언은 블록 내부에서 허용되지 않았기 때문에 일부 브라우저는 "끌어 올렸"만, 일부는 (기능 설명, ECMA-262의 확장으로 처리) 및 일부 오류를 던졌습니다. 이 동작은 현재 스펙에서 다소 표준화되었지만 사용은 권장하지 않습니다. [* duplicate link *] (http://stackoverflow.com/questions/43135925/why-javascript-function-declaration-behave-differently-in-chrome-and-safari)를 참조하십시오. – RobG

+0

@RobG - 정확하지 않습니다. 함수 호스팅에 대한이 페이지의 섹션을 참조하십시오. http://adripofjavascript.com/blog/drips/variable-and-function-hoisting –

+0

특히이 페이지에서 isItHoisted를 검색하여 기능 및 함께 제공되는 설명. –