let
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2016ë 9ì.
let ëª
ë ¹ë¬¸ì ë¸ë¡ ì¤ì½íì ë²ì를 ê°ì§ë ì§ì ë³ì를 ì ì¸íë©°, ì ì¸ê³¼ ëìì ììì ê°ì¼ë¡ ì´ê¸°íí ìë ììµëë¤.
ìëí´ ë³´ê¸°
let x = 1;
if (x === 1) {
let x = 2;
console.log(x);
// Expected output: 2
}
console.log(x);
// Expected output: 1
구문
let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];
매ê°ë³ì
nameN-
ë³ì ì´ë¦. 모ë ì í¨í JavaScript ìë³ìì¬ì¼ í©ëë¤.
valueNOptional-
ê°ê°ì ë³ì ì ì¸ì ëí´, ì í¨í JavaScript ííìì ì§ì í´ ë³ìì ì´ê¸° ê°ì ì§ì í ì ììµëë¤.
ì´ êµ¬ë¬¸ ëì 구조 ë¶í´ í ë¹ì ì¬ì©í´ì ë³ì를 ì ì¸í ìë ììµëë¤.
let { bar } = foo; // foo = { bar: 10, baz: 12 };
/* 10ì ê°ì ê°ì§ 'bar' ë³ì를 ìì± */
ì¤ëª
letì ì¬ì©íë©´ ë¸ë¡ ëª
ë ¹ë¬¸ì´ë letì ì¬ì©í ííì ë´ë¡ ë²ìê° ì íëë ë³ì를 ì ì¸í ì ììµëë¤. ì´ë letì´ var í¤ìëì ë¤ë¥¸ ì ì¼ë¡, varë ë³ì를 ë¸ë¡ì ê³ ë ¤íì§ ìê³ íì¬ í¨ì (ëë ì ì ì¤ì½í) ì´ëììë ì ê·¼í ì ìë ë³ì를 ì ì¸í©ëë¤. ëí letì íìê° êµ¬ë¬¸ì íê°í´ì¼ë§ ë³ì를 ê°ì¼ë¡ ì´ê¸°í(ìë ì°¸ê³ )íë¤ë ì ë varì ë¤ë¦
ëë¤.
constì ë§ì°¬ê°ì§ë¡ let ìì ì ì ë²ì ì ì¸ì ì¬ì©(ìµìì ì¤ì½í ì ì¸)í´ë window ê°ì²´ì ìë¡ì´ ìì±ì ì¶ê°íì§ ììµëë¤.
ì í¤ìëì ì´ë¦ì´ "let"ì´ ëëì§ì ëí ì¤ëª ì ì¬ê¸°ì ì½ì ì ììµëë¤.
ì°¸ê³ :
let ë³ìê° ê°ì§ ë¤ìí 문ì ë, let ë³ì ì ì¸ì íì¬ ì¤ì½íì 맨 ììì ìíí´ì í¼í ì ììµëë¤.
(ê°ë
ì±ì ìí¥ì ì¤ ì ììµëë¤)
ìì
>ì¤ì½í ê·ì¹
letì¼ë¡ ì ì¸í ë³ìë ìì ì ì ì¸í ë¸ë¡ê³¼ 모ë íì ë¸ë¡ì ì¤ì¤ë¡ì ì¤ì½íë¡ ê°ì§ëë¤. ì´ë° ì ììë letì´ varì ì ì¬í©ëë¤. ê·¸ë¬ë ëì ì¤ìí ì°¨ì´ë, varì ê²½ì° ì¤ì½íê° 'ìì ì ì ì¸í ë¸ë¡'ì´ ìëë¼, ìì ì ì ì¸ì í¬í¨íë í¨ìë¼ë ì ì
ëë¤.
function varTest() {
var x = 1;
if (true) {
var x = 2; // ê°ì ë³ì!
console.log(x); // 2
}
console.log(x); // 2
}
function letTest() {
let x = 1;
if (true) {
let x = 2; // ë¤ë¥¸ ë³ì
console.log(x); // 2
}
console.log(x); // 1
}
íë¡ê·¸ë¨ ìµìììì ì¬ì©í ê²½ì° varë ì ì ê°ì²´ì ìì±ì ì¶ê°íì§ë§ letì ì¶ê°íì§ ììµëë¤.
var x = "global";
let y = "global";
console.log(this.x); // "global"
console.log(this.y); // undefined
ë¹ê³µê° ë©¤ë² ëª¨ì¬
ìì±ìì letì í¨ê» ì¬ì©íë©´ í´ë¡ì 를 ì¬ì©íì§ ììë ë¹ê³µê° 멤ë²ë¥¼ ëíë¼ ì ììµëë¤.
var Thing;
{
let privateScope = new WeakMap();
let counter = 0;
Thing = function () {
this.someProperty = "foo";
privateScope.set(this, {
hidden: ++counter,
});
};
Thing.prototype.showPublic = function () {
return this.someProperty;
};
Thing.prototype.showPrivate = function () {
return privateScope.get(this).hidden;
};
}
console.log(typeof privateScope);
// "undefined"
var thing = new Thing();
console.log(thing);
// Thing {someProperty: "foo"}
thing.showPublic();
// "foo"
thing.showPrivate();
// 1
í´ë¡ì 를 ì¬ì©íë©´ var를 ì¨ë ìì ëì¼í ìë í¨í´ì 구íí ì ììµëë¤. ê·¸ë¬ë ì´ ê²½ì°, ì ì½ëì ê°ì ë¨ì ë¸ë¡ ì¤ì½í를 ì¬ì©í ì ìì¼ë©° í¨ì ì¤ì½í(ë³´íµ ëª¨ë í¨í´ì IIFE)ê° íìí©ëë¤.
ì¬ì ì¸
ê°ì ë³ì를 ê°ì í¨ìë ë¸ë¡ ì¤ì½í ììì ë¤ì ì ì¸íë ¤ê³ ìëíë©´ SyntaxErrorê° ë°ìí©ëë¤.
if (x) {
let foo;
let foo; // SyntaxError
}
switch ëª
ë ¹ë¬¸ìë ë¸ë¡ì´ íëë°ì ìì¼ë¯ë¡ ì´ ì¤ë¥ë¥¼ ì주 ë§ì£¼ì¹ ì ììµëë¤.
let x = 1;
switch (x) {
case 0:
let foo;
break;
case 1:
let foo; // ì¬ì ì¸ì¼ë¡ ì¸í SyntaxError
break;
}
ê·¸ë¬ë ë¶ê¸°ì ë¸ë¡ì ë°°ì¹íë©´ ë¸ë¡ ì¤ì½íë ìì±íë¯ë¡ ì¬ì ì¸ì¼ë¡ ì¸í ì¤ë¥ê° ë°ìíì§ ììµëë¤.
let x = 1;
switch (x) {
case 0: {
let foo;
break;
}
case 1: {
let foo;
break;
}
}
ì¼ìì ì¬ê°ì§ë
let ë³ìë ì´ê¸°íí기 ì ìë ì½ê±°ë ì¸ ì ììµëë¤(ì ì¸ êµ¬ë¬¸ì ì´ê¸° ê°ì ì§ì íì§ ìì ê²½ì° undefinedë¡ ì´ê¸°íí¨). ì´ê¸°í ì ì ì ê·¼ì ìëíë©´ ReferenceErrorê° ë°ìí©ëë¤.
ì°¸ê³ :
var ë³ìì ë¤ë¥¸ ì ì¼ë¡, varì ê²½ì° ì ì¸ ì ì ì ê·¼í ì undefinedì
ëë¤.
ë³ì ì¤ì½íì 맨 ììì ë³ìì ì´ê¸°í ìë£ ìì ê¹ì§ì ë³ìë "ì¼ìì ì¬ê°ì§ë"(Temporal Dead Zone, TDZ)ì ë¤ì´ê° ë³ìë¼ê³ ííí©ëë¤.
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError
var bar = 1;
let foo = 2;
}
"ì¼ìì " ì¬ê°ì§ëì¸ ì´ì ë, ì¬ê°ì§ëê° ì½ëì ìì± ìì(ìì¹)ê° ìëë¼ ì½ëì ì¤í ìì(ìê°)ì ìí´ íì±ë기 ë문ì
ëë¤. ì컨ë ìë ì½ëì ê²½ì° let ë³ì ì ì¸ ì½ëê° ê·¸ ë³ìì ì ê·¼íë í¨ìë³´ë¤ ìëì ìì¹íì§ë§, í¨ìì í¸ì¶ ìì ì´ ì¬ê°ì§ë ë°ì´ë¯ë¡ ì ì ëìí©ëë¤.
{
// TDZê° ì¤ì½í 맨 ìììë¶í° ìì
const func = () => console.log(letVar); // OK
// TDZ ììì letVarì ì ê·¼íë©´ ReferenceError
let letVar = 3; // letVarì TDZ ì¢
ë£
func(); // TDZ ë°ìì í¸ì¶í¨
}
TDZì typeof
typeof ì°ì°ì를 TDZ ë´ì let ë³ìì ì¬ì©í´ë ReferenceErrorê° ë°ìí©ëë¤.
console.log(typeof i); // ReferenceError
let i = 10;
ì ì¸ì¡°ì°¨ íì§ ìì ë³ì, ëë undefined를 ê°ì¼ë¡ ê°ì§ ë³ìì ë¤ë¥¸ ì ì
ëë¤.
console.log(typeof undeclaredVariable); // undefined ì¶ë ¥
ì´íì ì¤ì½íì ê²°í©í TDZ
ìë ì½ëë 주ìì¼ë¡ í기í ì§ì ìì ReferenceErrorê° ë°ìí©ëë¤.
function test() {
var foo = 33;
if (foo) {
let foo = foo + 55; // ReferenceError
}
}
test();
ë°ê¹¥ ì¤ì½íì var fooê° ê°ì ê°ì§ë¯ë¡ if ë¸ë¡ ëí íê°ë©ëë¤. ê·¸ë¬ë ì´íì ì¤ì½íë¡ ì¸í´, var fooì ê°ì ë¸ë¡ ë´ìì ì¬ì©í ì ììµëë¤. ì´ê³³ì foo ìë³ìë let foo를 ê°ë¦¬í¤ê¸° ë문ì
ëë¤. ë°ë¼ì (foo + 55) ííìì let fooì ì´ê¸°íê° ëëì§ ìì, ì¦ TDZì ë´ë¶ì´ë©° ReferenceErrorê° ë°ìíê² ëë ê²ì
ëë¤.
ìëì ê°ì ì½ëììë ì´ íìì¼ë¡ ì¸í´ ìë¹í í¼ëì 겪ì ì ììµëë¤. ë°ë³µë¬¸ì let n of n.aë for ë¸ë¡ì ì¤ì½íì ìíë¯ë¡, ìë³ì n.aë ë°ë³µë¬¸ ì¤ì¤ë¡ê° ì ì¸(let n)íë n ê°ì²´ì a ìì±ì ê°ë¦¬íµëë¤. ê·¸ë¦¬ê³ nì ì ì¸ í ì´ê¸°íê° ìì§ ëëì§ ììì¼ë¯ë¡ n.aë let nì TDZì ìí©ëë¤.
function go(n) {
// ì´ nì 매ê°ë³ì n
console.log(n); // Object {a: [1,2,3]}
for (let n of n.a) {
// ReferenceError
console.log(n);
}
}
go({ a: [1, 2, 3] });
기í ìì
ë¸ë¡ ë´ìì ì¬ì©í ê²½ì° letì ë³ìì ì¤ì½í를 í´ë¹ ë¸ë¡ì¼ë¡ ì íí©ëë¤. varë ì¤ì½í를 í¨ìë¡ ì ííë¤ë ì°¨ì´ì 주ìíì¸ì.
var a = 1;
var b = 2;
if (a === 1) {
var a = 11; // ì ì ë³ì
let b = 22; // if ë¸ë¡ ë³ì
console.log(a); // 11
console.log(b); // 22
}
console.log(a); // 11
console.log(b); // 2
ê·¸ë¬ë varì letì ìëì ê°ì´ ì¬ì©íë©´ SyntaxErrorì
ëë¤. í¸ì´ì¤í
ì¼ë¡ ì¸í´ varê° ë¸ë¡ ìµìë¨ì¼ë¡ ëì´ì¬ë ¤ì ¸, ë³ì ì¬ì ì¸ì íë ê²ê³¼ ê°ìì§ê¸° ë문ì
ëë¤.
let x = 1;
{
var x = 2; // ì¬ì ì¸ì¼ë¡ ì¸í SyntaxError
}
ëª ì¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification > # sec-let-and-const-declarations > |