JavaScript에서 블록 범위 변수 선언에 'let'이라는 이름이 선택된 이유는 무엇입니까?


306

나는 왜 var그 이름을 취하는 지 이해합니다 -그것은 가변적입니다 const-그것은 상수입니다. 그러나의 이름 뒤에 의미가 무엇 let입니까? 순리에 맡기다?


7
BASIC 1962 년 발명은, 사용 LET. 초기 언어 예제가있을 수 있습니다.
— David R Tribble

5
BASIC 은 1962 년이 아니라 1964 년 에 발명되었습니다 . 여기도 참조 하십시오 . 사용법은 LET1964 년 5 월자 pdf here , 매뉴얼의 첫 번째 초안 7 페이지에 설명되어 있습니다 .
— Joseph Quinsey

보다 구체적 const으로, 객체 자체가 여전히 변경 가능한 상수 또는 불변 (읽기 전용) 객체 참조입니다. 예 : 선언 / 할당 한 후 const foo = ['bar'], foo.push('bat')여전히 법률, 그러나 것 foo = ['bar', 'bat']아닙니다. 그러나 그것은 너무 많은 타이핑입니다.
— user982671

답변:


372

Scheme 및 Basic과 같은 초기 프로그래밍 언어에서 채택 된 수학적 진술입니다. 변수는 더 높은 수준의 추상화에 적합하지 않은 저수준 엔티티로 간주되므로 Clojure, F #, Scala와 같이 유사하지만 더 강력한 개념을 도입하려는 많은 언어 디자이너의 요구에 let따라 값이나 할당 가능한 변수, 그러나 변경되지 않았으므로 컴파일러는 더 많은 프로그래밍 오류를 포착하고 코드를 더 잘 최적화 할 수 있습니다.

JavaScript는 var처음부터 가지고 있었기 때문에 다른 키워드가 필요 했고 가능한 한 let가까운 곳에 기존 키워드로 이미 사용되는 수십 개의 다른 언어에서 빌려 왔습니다 var. JavaScript let에서는 블록 범위 로컬 변수가 대신 생성됩니다.


94
그리고 공식 Mozilla Documentation 페이지는이 질문 developer.mozilla.org/en/docs/Web/JavaScript/Reference/…에
— Sarath Chandra

9
또한 len('var') === len('let')선언문이 편집기에서 어느 쪽이든 잘 정렬되어 있음을 의미합니다. 나는 이것이 고의적이라는 것을 아직 제안하지는 않았지만 a) 시각적으로 즐겁고 더 읽기 쉽고 b) 두 가지를 혼합하면 디버그하기가 끔찍하게 짜증날 수 있습니다 (어쨌든 나쁜 생각처럼 보이지만, 나는 ' 봤어요).
— brichins

13
다시 말해, 자바 스크립트 let에서 let C = the speed of light비표준 범위를 갖는 변수를 설명하고 동시에 상수에 대한 다른 키워드를 도입하기로 결정한 것처럼 전통적으로 상수를 설명하는 데 사용되었습니다 .
— fijiaaron

1
나는 let에 가깝습니다 var. 또한 Scala는 사용 let하지 않으므로 그것이 어떻게 관련되는지 알 수 없습니다.
— Aluan Haddad

3
@fijiaaron : 비표준 범위 지정 방법? 전체 기능에 관계없이 무엇을 선언하든 당신이 선포하는 것이 이상하지 않습니까?
— SamB

78

나는 그것이 수학적 전통을 따른다고 생각합니다. 수학에서는 종종 "x는 임의의 실수"또는 이와 비슷하다고합니다.


우리 모두가 대수를 겪었을 때 간단하고 관련성이 높기 때문에이 대답을 더 선호합니다. 아마도 다른 사람들이 지적한 것과 같은 설명을 따라야합니다.
— duduwe

69

에 추가 exebook의 반응 , 키워드의 수학 사용 하자 도 잘의 범위 지정 의미 캡슐화 let자바 스크립트 / ES6 사용할 때를. 특히 다음 ES6 코드 가 의 값을 인쇄 toPrint 할 때 중괄호로 할당을 인식하지 못하는 것처럼 'Hello World',

let toPrint = 'Hello World.';
{
    let toPrint = 'Goodbye World.';
}
console.log(toPrint); // Prints 'Hello World'

하자 공식화 수학 (증거 특히 쓰기)에서 사용 된 변수의 현재 인스턴스가 아니라 논리적 인 생각의 범위에 있다는 것을 나타냅니다. 다음 예에서 x는 새로운 아이디어를 입력하면 즉시 새로운 정체성을 얻으며 (보통 이들은 주요 아이디어를 증명하는 데 필요한 개념 임) 하위 증명이 끝나면 즉시 이전 x로 되돌아갑니다. 물론 코딩에서와 같이 다소 혼동되는 것으로 간주되므로 일반적으로 다른 변수에 다른 이름을 선택하면 피할 수 있습니다.

x를 그렇게 보자 ...

  증거물

 새로운 아이디어 {x를 다른 것으로 보자 ... 무언가를 증명해라} 새로운 아이디어를 맺다

 오래된 x로 주요 아이디어 증명


19
나는 이것이 정말로 유용하다고 생각합니다. 받아 들일 수있는 대답은 변경 될 수없는 가치에 대해 이야기하기 때문에 거의 오도 된 것 let입니다. let범위에 관한 것입니다.
— jinglesthula

단지 생각 : let코드 작성자의 마음에 이런 일이 생길 것이라고 생각합니다. "오, 지금이 순간 let foo = bar, 그러나 그것은 원래의 가치로 돌아가거나 중단 될 수 있습니다. 이것은 깔끔하게 설명되어 있습니다. 의 차단 범위 및 재 선언 변수의 예제 이 W3Schools의 프리젠 테이션 의 let. 다시 말하지만, 어떤 종류의 과학적인 대답을 유치하지만, 내가 사용하고자 할 때 기억이 더 같은 기억을 돕는 장치를 공유하는 척하지 let.
— 알랭

개념적 명확성을 위해 여기에서 약간 더 정확할 가치가 있다고 생각합니다. 예제 ES6 코드는 "괄호 안의 할당을 무시하지 않습니다". 블록 내에 만 존재 하는 새 변수 에 대해toPrint 지시에 따라 할당을 수행 한 다음 블록이 끝나면 해당 변수를 정식으로 버립니다. 그리고 나가면, 우리는 toPrint더 이상 내부 가 존재하지 않는 외부 스코프로 돌아갑니다 . 그래서 outer를console.log(toPrint) 참조하십시오 . 그것은 무시되는 것이 아니라 변수가 범위에 의해 정의 된 유한 수명을 갖는 것입니다. toPrintlet
— FeRD

1
@FeRD, 훌륭한 지적. 위의 내용을 난독화할 때 "무시"라는 단어의 사용을 제거하기 위해 위의 내용을 편집했습니다.
— 에반 화이트

36

var범위 차이로 정확히 무엇을 합니까? 이제는 var이미 사용되었으므로 이름을 사용할 수 없습니다 .

그래서 그것은 흥미로운 영어 구성에서 의미를 가진 다음으로 최고의 이름을 얻은 것으로 보입니다.

let myPet = 'dog';

영어로 "내 애완 동물이 개가되게하자"


5
let의 기원은 언어적이고 수학적이지만, 가정에 대한 참조는 의심 할 여지없이 모든 버전의 BASIC 프로그래밍 언어에서 LET 문입니다. ES6의 저자 중 다수가 끝났다면 학습을 시작했을 것입니다 40 세
— wide_eyed_pupil

5
@wide_eyed_pupil FYI : BASIC에서 자란 40 세 이상 (ES6의 저자는 아니지만)으로서, 내가 참여한 커뮤니티는 LET를 사용한 사례가 없습니다. 우리는 방금 파이썬과 같이 변수를 할당했습니다. (예를 들어 A$="HELLO WORLD") 관련된 해석기는 Rockwell AIM 65 BASIC, Atari Basic, CP / M의 MBASIC 5, Applesoft BASIC, 심지어 CP / M의 MS BASIC 컴파일러 인 BASCOM을 포함했습니다. VAX BASIC은 LET을 가지고 있었지만, 내가 기억하는 것처럼 요구하지 않았습니다. 당시에는 기억력이 빡빡했으며, 특히 "큰"프로그램에서 문장 당 3 ~ 4 개의 추가 문자가 달라졌다.
— 피터 헐

@PeterHull 흥미 롭습니다. 저는 디지털 CPU에 부착 된 연필로 표시된 카드를 처음으로 코딩 한 다음 노인 연구소의 메인 프레임과 학교의 디지털 PDP8을 코딩했습니다. 한 번도 사람들이 실제로 성명서를 사용하지 않고 LET을 사용하는 것을 보지 못했습니다. 내가 사용하는 버전에서 GOSUB (예 : 재사용 가능한 기능)조차 얻지 못하고 좋은 기본이 나왔을 때 FORTRAN 및 PASCAL로 코딩하도록 권장되었습니다.
— wide_eyed_pupil

let 변수를 다시 선언 할 수 없습니다.
— CONvid19

10

가장 가능성있는 가능성은 가장 관용적 인 선택이었습니다. 말하기는 쉬울뿐만 아니라 이해하기도 직관적입니다. 어떤 사람들은보다 더 논쟁 할 수 var있습니다.

그러나 나는 이것에 대한 역사가 조금 더 있다고 생각합니다.

에서 위키 백과 :

Dana Scott의 LCF 언어는 람다 미적분학을 현대적인 기능 언어로 발전시키는 단계입니다. 이 언어는 그 이후로 대부분의 기능적 언어로 등장한 let 표현을 도입했습니다.

ALGOL 및 Pascal과 같은 상태 전체 명령 언어는 기본적으로 let 구조를 구현하여 제한된 범위의 기능을 블록 구조로 구현합니다.

나는 이것이 let자바 스크립트 에서도 영감이되었다고 믿고 싶다 .


이 답변은 람다 미적분학 'let expression'을 말하며 OP가 요청한 것이 아닐 수도 있습니다. 그리고 그것은 LET1964 년부터 BASIC 보다 늦게 나타납니다 .
— Joseph Quinsey

이 기사 전체는 2014 년 위키 백과 사용자 Thepigdog이 기본적으로 한 손으로 쓴 기사 중 하나입니다. 스캇의 논문 은 ES6 이 JavaScript에 도입 한 것과 같은 방식으로 람다 미적분에 let 식 을 "소개했다"고 해석했다 let. 그것이 진실로 사실이 아니라면, 진정한 의미는 없습니다. (그리고하지의 스콧의 사용했다 "는하자"고 가능성을 배제 어떤 방법으로 도 기본에 의해 영감을 LET.)
— FeRD

1

var는 함수 범위 또는 전역 범위 인 반면보다 즉각적인 블록 수준의 제한된 범위를 사용합시다.

그것은 많은 다른 언어에서 BASIC과 같은 변수를 정의하기 위해 다른 많은 언어에서 발견 되었기 때문에 가장 많이 선택된 것으로 보입니다.


1

나는 Scheme에 대한 JavaScript의 빚이 명백하다고 생각합니다. 체계에는 let뿐만 아니라 let *, let * -values, let-syntax 및 let-values도 있습니다. (4 번째 Ed. Scheme Programming Language 참조).

(이 선택은 JavaScript가 Lispy라는 개념에 더 많은 신뢰를 부여하지만, 우리가 제거하기 전에는 동음이 아닙니다.)))


1

그것은 "어휘 환경을 입력하거나 묶여"와 같은 의미 일 수도 있었다 .. 그것은 단순히 일 "할 것이라고 날 귀찮게 이 될 것을 ". 그리고 rec가 람다 미적분학에서 이해가되지 않도록하십시오.


나는 이것과 같은 대답을 찾고 있었다. 나는 그것이 "let"이라는 일반적인 영어의 의미를 가지고 있다고 의심한다.
— Meenohara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.