let
구문은 블록 유효 범위를 갖는 지역 변수를 선언하며, 임의로 값을 초기화할 수 있다.
Syntax
let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];
Parameters
var1
,var2
, …,varN
- 변수명. 유효한 식별자이면 가능하다.
value1
,value2
, …,valueN
- 변수의 초기값. 유효한 표현식이면 가능하다.
Description
let
은 선언된 블록 유효 범위에 상관없이 전역 또는 함수 유효 범위를 갖는 var
키워드와는 달리, 변수가 사용되는 블록, 구문 또는 표현식 유효 범위를 갖는 변수를 선언한다.
블록 유효 범위와 let
블록 내에 변수를 정의하기 위해 let
키워드를 사용한다.
if (x > y) { let gamma = 12.7 + y; i = gamma * x; }
let
은 내장 함수(inner function)를 사용할 때 때때로 코드를 명확하게 한다.
var list = document.getElementById("list"); for (var i = 1; i <= 5; i++) { var item = document.createElement("LI"); item.appendChild(document.createTextNode("Item " + i)); let j = i; item.onclick = function (ev) { console.log("Item " + j + " is clicked."); }; list.appendChild(item); }
위 예제는 의도한대로 동작하는데, 5개의 익명 내장 함수가 5개의 각기 다른 변수 j
를 참조하기 때문이다. 만약 let
을 var로 대체하거나 변수 j
를 삭제하고 단순히 변수 i
를 내장 함수에서 사용할 경우 위 예제는 의도대로 동작하지 않음에 주의하라.
유효범위 규칙
let
으로 선언한 변수는 변수를 선언한 블록과 그 내부 블록들에서 유효하다. 이럴 경우, let
은 var
와 같이 동작한다. 가장 큰 차이점은 var 변수의 유효 범위는 전체 외부 함수까지라는 점이다.
function varTest() { var x = 31; if (true) { var x = 71; // same variable! console.log(x); // 71 } console.log(x); // 71 } function letTest() { let x = 31; if (true) { let x = 71; // different variable console.log(x); // 71 } console.log(x); // 31 }
프로그램 또는 함수의 최상위에서는 let
은 var
와 완전히 똑같이 동작한다. 예를 들어,
var x = 'global'; let y = 'global'; console.log(this.x); console.log(this.y);
이 코드의 출력은 “global”을 두번 출력한다.
let
의 일시적 사각 지대(Temporal dead zone)와 에러
동일한 함수 또는 블록 범위에서 동일한 변수를 재선언시 TypeError
가 발생한다.
if (x) { let foo; let foo; // TypeError thrown. }
ECMAScript6에서는 let
은 변수를 블록의 최상단으로 호이스팅하지만, 만약 블록 내에서 변수가 선언되기 전에 해당 변수를 참조할 경우 ReferenceError
가 발생한다. 이 변수는 블록의 시작부터 선언되어질 때까지 “일시적 사각 지대”에 있다.
function do_something() { console.log(foo); // ReferenceError let foo = 2; }
switch
문 사용 시에는 하나의 기본 블록만이 있기 때문에 에러가 발생할 수 있다.
switch (x) { case 0: let foo; break; case 1: let foo; // TypeError for redeclaration. break; }
for
루프에서 let으로 선언한
변수의 유효 범위
for
루프의 범위를 지역 변수의 유효 범위로 설정하기 위해 let
키워드를 사용할 수 있다. var
키워드를 for 루프에서 사용할 때 루프를 포함한 함수 전체에서 해당 변수가 유효한 것과는 다르다.
var i=0; for ( let i=i ; i < 10 ; i++ ) { console.log(i); }
유효 범위 규칙
for (let expr1; expr2; expr3) statement
이 예에서 let expr1
으로 선언한 지역 변수들을 포함하는 암시적 블록이 expr2
, expr3
그리고 statement를
둘러싸고 있다. 이것을 위 첫번째 루프에서 확인할 수 있다..
Examples
let
vs var
블록 내에서 사용하는 경우, let은 변수의 유효 범위를 블록 내로 제한한다. var의 유효 범위는 변수가 선언된 함수 전체임을 참고하라.
var a = 5; var b = 10; if (a === 5) { let a = 4; // The scope is inside the if-block var b = 1; // The scope is inside the function console.log(a); // 4 console.log(b); // 1 } console.log(a); // 5 console.log(b); // 1
루프 내에서의 let
루프의 범위를 지역 변수의 유효 범위로 설정하기 위해 (var
를 이용하여 정의된) 전역 변수를 사용하는 대신 let
키워드를 사용 할 수 있다.
for (let i = 0; i<10; i++) { console.log(i); // 0, 1, 2, 3, 4 ... 9 } console.log(i); // i is not defined
비표준 let 확장
let
blocks
let
블록은 Gecko 44에서 삭제되었다 (bug 1167029).
let
블록은 블록 외부에 있는 같은 이름의 변수의 값에 영향을 주지 않고, 블록의 범위 내에서 변수 값을 연결시키는 방법을 제공한다.
Syntax
let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) block;
Description
let
블록은 변수에 대한 지역 유효 범위 지정을 제공한다. 이는
0개 이상의 변수들을 하나의 코드 블록의 문법적 유효 범위 내로 바인딩하여 동작하는데 그렇지 않을 경우, 블록 구문과 정확히 동일하다. let
블록 내에서 var
를 사용하여 선언한 변수의 유효 범위는 여전히 let
블록 밖에 선언한 변수와 동일하니 이 점에 특히 주의하라. 이럴 경우 여전히 함수 유효 범위를 가지게 된다. let
블록 문법을 사용하는 경우, let
에 다음에 괄호가 필요하다. 괄호를 포함하지 않을 경우 구문 오류가 발생한다.
Example
var x = 5; var y = 0; let (x = x+10, y = 12) { console.log(x+y); // 27 } console.log(x + y); // 5
코드 블록에 대한 규칙은 Javascript의 다른 코드 블록 규칙과 동일하다. let
블록은 let
으로 선언된 지역 변수들을 가질 수 있다.
유효 범위 규칙
let
블록을 이용하여 정의한 변수들의 유효 범위는 해당 let
블록과 같은 이름의 변수를 정의하지 않은 모든 내부 블록이다.
let
expressions
let 표현식은 Gecko 41에서 삭제되었다 (bug 1023609).
let
표현식(expression)은 변수의 유효 범위를 하나의 표현식으로 설정할 수 있다.
Syntax
let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) expression;
Example
변수의 유효 범위를 오직 하나의 표현식으로 설정하기위해 let을 사용할 수 있다.
var a = 5; let(a = 6) console.log(a); // 6 console.log(a); // 5
유효 범위 규칙
let
표현식이 있을 때,
let (decls) expr
expr
을 둘러싼 암시적인 블록이 있다.
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Let and Const Declarations' in that specification. |
Standard | Initial definition. Does not specify let expressions or let blocks. |
ECMAScript 2016 Draft (7th Edition, ECMA-262) The definition of 'Let and Const Declarations' in that specification. |
Draft |
Browser compatibility
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 41.0 | (Yes) | 44 (44) | 11 | 17 | ? |
Temporal dead zone | ? | (Yes) | 35 (35) | ? | ? | ? |
let expression |
Not supported | Not supported | Not supported | Not supported | Not supported | Not supported |
let block |
Not supported | Not supported | Not supported | Not supported | Not supported | Not supported |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | ? | 41.0 | 44.0 (44) | ? | ? | ? |
Temporal dead zone | ? | ? | 35.0 (35) | ? | ? | ? |
let expression |
Not supported | Not supported | Not supported | Not supported | Not supported | Not supported |
let block |
Not supported | Not supported | Not supported | Not supported | Not supported | Not supported |
Firefox-specific notes
-
SpiderMonkey44(Firefox 44 / Thunderbird 44 / SeaMonkey 2.41)에 앞선 버전에서,
let
은<script type="application/javascript;version=1.7”>블록(또는 더 높은 버전)으로 둘러싸인 코드 블록 내에서만 사용할 수 있고 다른 의미를 갖는다.
-
Worker
코드 내에서의 지원은dom.workers.latestJSVersion 플래그를 사용해야한다. let이 버전이 상관없이 지원된다면, 이 플래그는 후에 삭제될 것이다.
- SpiderMonkey의 let에 대한 ES6 준수는 bug 950547에서 트래킹하고 있다.