자바스크립트 함수선언 승격, 함수본체도 같이 승격되나요?
이 가 아닌 경우 다음과 같은 반례가 있습니다.
으아아아이 인 경우 다음과 같은 반례가 있습니다.
으아아아첫 번째 예는 함수 본문도 승격된다는 것을 보여줍니다. 이 아이디어를 따라 코드의 두 번째 부분을 이해하면 "이름 바꾸기" 함수가 서로를 다루고 이후의 함수가 이전 함수를 다루므로 콘솔입니다. log(func) 'function func() {console.log('22');};' 문자열이 출력되지만 실제로는 그렇지 않습니다.
세 가지 질문이 발생합니다:
"변수 프로모션, 기능 우선순위"를 어떻게 이해하나요?
기능 본체도 개선됐나요?
두 번째 코드의 결과를 어떻게 해석하나요?
제가 쓴 글을 읽으시면 모든 내용을 이해하실 것이라 믿습니다. JavaScript 실행 컨텍스트, 함수 스택 및 프로모션의 개념을 깊이 이해하세요
if는 조건부 판단을 나타냅니다. 컴파일 중에는 코드를 실행해서는 안 되며 구문 및 어휘 분석만 확인합니다. 브라우저를 변경해 보거나, 테스트를 위해 엄격 모드를 활성화해 보세요~
1. 변수 승격, 함수 우선순위, 즉 var a = 1; function fun(){}; 및 function fun(){}이 범위의 최상위 수준으로 승격됩니다.
으아악2. 또한 개선되었습니다. 함수 표현식은 그렇지 않습니다. var fun = function(){}; 이 유형은 var fun을 향상시킬 뿐입니다.
3 두 번째 단락은 실제로 다음과 같이 설명할 수 있습니다
자세한 소개는 MDN http://kangax.github.io/nfe/#...
을 참조하세요.비엄격 모드에서는 if 문 내부에 있는 함수 선언의 승격 여부가 각 커널의 구현에 따라 다릅니다.
결론은 기능이 개선되겠지만 if 문 내부에서 각 코어의 구현 여부에 따라 다릅니다.
엄격 모드는 스크립트나 함수 수준이 아닌 함수 선언을 금지합니다
참조할 수 있는 곳: /q/10...
함수 및 변수 선언이 승격됩니다. 함수 승격이 변수 승격보다 우선합니다. 직접 실행되는 코드는 승격될 수 없습니다. 첫 번째 코드는 직접적으로 개선되었습니다. 두 번째 코드에서 정의한 함수는 if 문 구조에 있습니다. 두 개의 로그와 if는 실행 중인 스택에서 순서대로 실행되어야 합니다. 분명히 if 문이 실행되기 전에 func가 선언되지 않았습니다.
es6에는 몇 가지 블록 수준 범위 규칙이 있습니다. 이전 버전의 노드 또는 낮은 버전의 Chrome에서 실행하면 다음 코드와 동일합니다
그러나 상위 버전의 노드 및 크롬에서는 이러한 변수의 개선이 제한되어 코드 상황이 발생하게 됩니다! ~! ~으아악
JavaScript는 함수 수준 범위이기 때문입니다(
function-level scope
)所以if中并没有独立维护一个
scope
영어 설명:
javascript-variable-scope-and-hoisting-explained
중국어 설명: Javascript 범위 및 변수 호이스팅
일반적으로 조건문에 함수 선언을 작성하는 것은 권장되지 않습니다.
으아악이것은 ECMAScript의 잘못된 구문이며 JavaScript 엔진은 오류를 수정하고 정상적이고 합리적인 상태로 변환하려고 시도합니다. 하지만 이 수정 방법은 브라우저마다 다릅니다. 함수 표현식을 사용하는 것이 좋습니다:
var func;
if(true){
}그밖에{
으아악}
http://blog.csdn.net/qq673318...
링크에 설명 있음
————포터