이전 ES5의 사양에서는 함수가 최상위 범위와 함수 범위에서만 선언될 수 있고 블록 수준 범위에서는 선언될 수 없다고 규정했습니다. 따라서 이와 같은 진술은 실제로 불법입니다.
으아악
그러나 실제로 모든 주요 브라우저는 호환성 고려 사항으로 인해 이 사양을 준수하지 않습니다.
현재 ES6 시대에는 사양에 블록 수준 범위의 존재가 명시되어 있으며, 블록 수준 범위에서 기능을 정의할 수 있습니다. 그러나 실제로는 그렇게 간단하지 않습니다. 왜냐하면 이 경우 정의된 함수의 동작이 과거와 호환되지 않기 때문입니다. ES6는 과거와의 호환성을 보장하기 위해 브라우저 구현에 필요하지 않다고 규정하고 있습니다. 위의 규정을 준수하기 위해 자신만의 행동 방식을 가지십시오.
ES6 브라우저에서는 실제로 다음과 같이 동작합니다:
블록 범위에서 함수 정의 허용
함수 선언은 실제로 var를 사용하여 선언된 함수 표현식과 유사하며, 함수 이름은 현재 함수 범위의 맨 위로 승격됩니다
동시에 함수 선언은 블록 수준 범위에서 호이스팅 동작도 유지합니다
첫 번째 코드의 경우 보고되는 오류를 자세히 살펴보면 Uncaught TypeError: e는 함수가 아닙니다와 같은 오류를 발견할 수 있습니다. Uncaught TypeError: e is not a function。 这个错误表示,e不是函数,换句话来说,就是e이 오류는 e가 함수가 아니라는 의미입니다. 즉, 변수 e가 존재하지만 함수가 아니라는 의미입니다. 위에서 언급한 세 가지 규칙을 결합하면 실제로 다음과 같이 실행된다고 생각하기 쉽습니다.
이건 사실 역사적인 문제인데...
이전 ES5의 사양에서는 함수가 최상위 범위와 함수 범위에서만 선언될 수 있고 블록 수준 범위에서는 선언될 수 없다고 규정했습니다. 따라서 이와 같은 진술은 실제로 불법입니다.
으아악그러나 실제로 모든 주요 브라우저는 호환성 고려 사항으로 인해 이 사양을 준수하지 않습니다.
현재 ES6 시대에는 사양에 블록 수준 범위의 존재가 명시되어 있으며, 블록 수준 범위에서 기능을 정의할 수 있습니다.
그러나 실제로는 그렇게 간단하지 않습니다. 왜냐하면 이 경우 정의된 함수의 동작이 과거와 호환되지 않기 때문입니다. ES6는 과거와의 호환성을 보장하기 위해 브라우저 구현에 필요하지 않다고 규정하고 있습니다. 위의 규정을 준수하기 위해 자신만의 행동 방식을 가지십시오.
ES6 브라우저에서는 실제로 다음과 같이 동작합니다:
블록 범위에서 함수 정의 허용
함수 선언은 실제로
var
를 사용하여 선언된 함수 표현식과 유사하며, 함수 이름은 현재 함수 범위의 맨 위로 승격됩니다동시에 함수 선언은 블록 수준 범위에서 호이스팅 동작도 유지합니다
첫 번째 코드의 경우 보고되는 오류를 자세히 살펴보면
으아악Uncaught TypeError: e는 함수가 아닙니다
와 같은 오류를 발견할 수 있습니다.Uncaught TypeError: e is not a function
。这个错误表示,
e
不是函数,换句话来说,就是e
이 오류는e
가 함수가 아니라는 의미입니다. 즉, 변수e
가 존재하지만 함수가 아니라는 의미입니다. 위에서 언급한 세 가지 규칙을 결합하면 실제로 다음과 같이 실행된다고 생각하기 쉽습니다.변수 승격 후에는 다음과 같이 됩니다:
으아악두 번째 코드 부분은 언급할 필요가 없습니다.
if 문 내의 함수 선언은 함수 표현식과 마찬가지로 승격되지 않으므로 첫 번째는 구문 오류이고 두 번째는 10을 출력합니다
으아악
=>
에 해당 으아악