[javascript] JavaScript가 변수를 호이스트하는 이유는 무엇입니까?

JavaScript가 변수를 호이스트하는 이유는 무엇입니까?

설계자가 호이 스팅을 구현하기로 결정한 이유는 무엇입니까? 이 작업을 수행하는 다른 인기있는 언어가 있습니까?

문서 및 / 또는 기록에 대한 관련 링크를 제공하십시오.



답변

Stoyan Stefanov가 “JavaScript Patterns”책에서 설명했듯이, 게양은 JavaScript 인터프리터 구현의 결과입니다.

두 단계로 수행되는 JS 코드 해석. 첫 번째 패스 동안 인터프리터는 변수 및 함수 선언을 처리합니다.

두 번째 단계는 실제 코드 실행 단계입니다. 인터프리터는 함수 식과 선언되지 않은 변수를 처리합니다.

따라서 이러한 동작을 설명하기 위해 “게양”개념을 사용할 수 있습니다.


답변

JS 제작자 Brendan Eich는 한때 트위터에서 다음과 같이 말했습니다 .

“var 호이 스팅은 기능 호이 스팅의 의도하지 않은 결과, 블록 범위 없음, [그리고] JS는 1995 년 러시 작업이었습니다.”

그는 또한 설명했다…

“기능 호이 스팅은 하향식 프로그램 분해를 허용하고, 무료로 ‘re rec’를 사용하고, 선언하기 전에 호출합니다. var 호이 스팅은 함께 태그가 지정됩니다.”

Brendan Eich

이 작업을 수행하는 다른 인기있는 언어가 있습니까?

같은 방식으로 변수를 끌어 올리는 다른 인기있는 언어는 없습니다. Flash 개발에 사용되는 ECMAScript의 또 다른 구현 인 ActionScript조차도 호이 스팅을 구현하지 않은 것 같습니다. 이것은 JavaScript를 배우는 다른 언어에 익숙한 개발자들에게 혼란과 좌절의 원천이었습니다.

업데이트 : 주석에서 Python은 유사한 가변 호이 스팅 동작을 가지고 있습니다 .


답변

이는 자바 스크립트 인터프리터가 두 주기로 코드를 해석하기 때문입니다.

  1. 코드 완성 / 컴파일 :
  2. 코드 실행 :

첫 번째 사이클에서 모든 변수 및 함수 선언은 실행중인 함수 범위의 맨 위로 이동합니다. 이는 실행되기 전에 variableObjectsfor execution context함수 를 만드는 데 도움이됩니다 .

2 단계에서는 값 할당, 코드 문 및 함수 호출이 예상되는 방식으로 한 줄씩 발생합니다.

여기 에서 좀 더 자세히 읽을 수
있습니다.

그것은 당신에게 행동 약 더 나은 사진을 줄 것이다 let, const그리고 class선언은 변수와 함수 사이에 다음과 같은 우선 순위를.


답변