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


95

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

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

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


7
이 시점 에서 나는 그것이 역사적이라고 생각하고 그것이 원래 "구현의 용이성"이외의 다른 어떤 것인지 진지하게 의심합니다.
— Dave Newton

4
솔직히 Brendan Eich에게 물어보십시오. 그는 상당히 반응이 좋은 것 같습니다.
— Felix Kling 2013

23
어떻게 이런 질문 하지가 건설?
— Francisc

19
당신이 약을 요청할 수있는 모든 스택 오버플로 @Francisc 환영는 이동됩니다 divjQuery를에
— Xlaudius

21
이것은 정말 중요한 질문입니다. 허용되었을 것입니다. 화염 미끼가 아니 었습니다. 호이 스팅은 JavaScript가 작동하는 방식을 이해하는 핵심 요소 중 하나이며 "왜"는 대부분의 교과서에서 다루는 언어의 합법적 인 질문입니다. Stack Overflow 사람들이 이와 같은 사람들의 질문을 끊임없이 밟는 것은 괜찮지 않습니다.
— bearvarine 2015-09-22

답변:


55

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

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

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

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


15
저는 개인적으로 "게양"이라는 단어를 정말 좋아하지 않습니다. 변수 및 함수 선언이 마술처럼 현재 범위의 맨 위에 올랐다는 잘못된 표현을 제공합니다. 실제로 JS 인터프리터는 언급했듯이 소스 코드에서 바인딩을 스캔 한 다음 코드 를 실행합니다.
— contactmatt

이제 JS가 언어를 가장 오해하는 이유를 알게되었지만 어떤 튜토리얼에서도 이것을 보지 못했습니다. 호이 스팅 (및 해석기 흐름)과 혼동되었습니다.
— Swapnil Patwa

18
어, 이건 그 이유를 설명하지 않습니다. 단일 패스 통역사 (게양으로 이어지지 않았을 것임)가 훨씬 더 간단했을 것입니다. 그러면 디자이너가 두 번의 패스를 선택한 이유는 무엇입니까?
— Bergi

1
이것은 변수, 특히 게양되는 이유를 설명하지 않습니다. 함수는 의미가 있지만 변수는 의미가 없습니다 (대부분의 경우)-버그라고 생각합니다.
— Josh M.

1
조쉬 M. 이것은 너무 광범위하게 (나는이 대답 나던 정말 추론하지만 대답 동의) ... 나는 이것이 "버그"이라고 생각하지 않는다, 지정
— 조나스 윌름

11

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

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

그는 또한 설명했다…

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

Brendan Eich

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

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

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


2
질문을 직접 해결하려는 유일한 답변이므로 +1을 제공합니다.
— Damon

1
이 답변에 감사드립니다. @Damon에 전적으로 동의합니다!
— codingbryan

1
가변 호이 스팅이있는 또 다른 인기있는 언어는 Python입니다. stackoverflow.com/q/63337235/2326961
— Maggyero

2

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

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

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

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

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

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


1
디자인 선택의 결과라고 암시하고 있습니까? 그렇다면 답변에 명확하게 설명해야합니다. 그러나 Brendan Eich의 답변을 읽으면 원하는 기능이 될 수 있으며 마지막 문장을 해석하는 방법에 따라 다릅니다. 결론, 나는 아직도 확실히 이유를 모른다
— Bombinosh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.