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.