programing

블록 범위가 원래 JavaScript에서 구현되지 않은 이유는 무엇입니까?

nasanasas 2020. 11. 4. 08:05
반응형

블록 범위가 원래 JavaScript에서 구현되지 않은 이유는 무엇입니까?


필자는 내 경험을 통해 JavaScript에 블록 범위가 없다는 것을 읽고 발견했습니다. 언어가 이런 식으로 설계된 이유가 있다고 가정 할 때 그 이유가 무엇인지 설명해 주시겠습니까?

나는 구글과 여기를 둘러 보았지만 내가 찾은 게시물은 JS가 블록 범위가 아닌 함수 범위를 가지고 있다는 것을 반복하지만 이유는 설명하지 않았다. 왜 이것이 사실인지 궁금합니다.


내 댓글을 답변으로 변환

제작자 선택 : Brendan을 트윗하고 다음과 같은 답변을 받았습니다 .

@mplungjan 10 일은 블록 범위를위한 시간을 남기지 않았습니다. 또한 90 년대 중반 시대의 많은 "스크립팅 언어"는 스코프가 거의 없었고 나중에 더 성장했습니다.


즉, 다음과 같은 몇 가지 관련 사항이 있습니다.

중요 : ECMAScript2015 (6 판) 이전의 JavaScript에는 블록 범위가 없습니다. 블록 내에 도입 된 변수는 포함하는 함수 또는 스크립트로 범위가 지정되며 설정의 효과는 블록 자체를 넘어서 지속됩니다. 즉, 블록 문은 범위를 도입하지 않습니다. "독립 실행 형"블록은 유효한 구문이지만 JavaScript에서 독립 실행 형 블록을 사용하고 싶지는 않습니다. C 또는 Java에서 이러한 블록과 같은 작업을 수행한다고 생각하면 사용자가 생각하는 작업을 수행하지 않기 때문입니다.

새 함수를 만들고 즉시 호출하여 인위적으로 범위를 도입 할 수 있습니다.

let그리고 const선언 된 변수가 게양되어 있지만,이되어 있지 초기화 undefined같은 방법으로 var한다. 따라서 값이 할당되기 전에 let또는 const선언 된 변수를 참조하면 ReferenceError가 발생합니다.

동일한 블록 범위에서 동일한 변수를 다시 선언하면 SyntaxError가 발생합니다.


2015 년의 새로운 답변입니다. ES6에는 letconst키워드로 변수 정의에 대한 블록 범위가 있습니다 .


다음과 같은 이유로 블록 범위가 구현되지 않았습니다.

  1. 이는 언어를 구현하기 쉽게 만듭니다. JavaScript는 처음에는 대화 형 웹 응용 프로그램을 작성하기위한 언어로 설계되었습니다. 따라서 작고 쉽게 구현할 수 있어야했습니다.
  2. 블록 범위는 JavaScript와 같은 동적 언어에 성능 저하를 가져옵니다. 이는 현재 범위에없는 일부 변수에 액세스하려고 할 때 JavaScript가 먼저 현재 범위를 확인한 다음 부모 범위 등을 변수를 찾거나 끝에 도달 할 때까지 계속 확인하기 때문입니다. 따라서 블록 범위의 도입은 루프 및 중첩 루프에서 변수 액세스를 매우 느리게 만듭니다.
  3. 블록 범위가 없기 때문에 프로그램을 더 쉽게 작성할 수 있습니다. 예를 들어 특정 조건이 참인 경우에만 변수를 만들고 싶다고 가정합니다. JavaScript에서해야 할 일은 if명령문 내에서 변수를 선언하고 정의하는 것입니다. C와 같은 언어에서는 if외부에서 변수를 선언하고 문 내에서 정의해야 if합니다.
  4. 블록 범위가 없기 때문에 선언을 끌어 올릴 수 있습니다. 이것은 함수 선언의 경우에 특히 유용합니다. 예를 들어 다음 바이올린을 참조하십시오 : http://jsfiddle.net/L6SgM/ (그러나이 예제는 Firefox에서 작동하지 않음).
  5. JavaScript는 일급 함수 표현식을 지원하므로 블록 범위가 필요하지 않습니다. 즉시 호출되는 함수 표현식을 사용하여 시뮬레이션 할 수 있습니다 .

여러 가지 이유가 있지만 일부는 객체 리터럴 (때로는 블록처럼 보일 수 있음)을 사용하는 코드 구문 분석 / 디버깅을 지원하고 지역 변수의 가비지 수집을 단순화하기위한 것입니다.

약속 된 지원 (예 : http://esdiscuss.org/notes/2012-07-25 )이 실제적인 것으로 판명 되었으면i 합니다. 그 이유는 로컬에만 해당되는 변수를 사용하는 것이 매우 편리하기 때문입니다 . 단일 루프.

참고 URL : https://stackoverflow.com/questions/17311693/why-was-block-scope-not-originally-implemented-in-javascript

반응형