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.