let
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2016å¹´9æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
let 宣è¨ã¯ãå代å
¥å¯è½ãªããããã¯ã¹ã³ã¼ãã®ãã¼ã«ã«å¤æ°ã宣è¨ãã¾ããä»»æã§å¤ã代å
¥ãã¦åæåã§ãã¾ãã
試ãã¦ã¿ã¾ããã
let x = 1;
if (x === 1) {
let x = 2;
console.log(x);
// äºæ³ãããçµæ: 2
}
console.log(x);
// äºæ³ãããçµæ: 1
æ§æ
let name1;
let name1 = value1;
let name1 = value1, name2 = value2;
let name1, name2 = value2;
let name1 = value1, name2, /* â¦, */ nameN = valueN;
弿°
nameN-
宣è¨ãã夿°ã¾ãã¯è¤æ°ã®å¤æ°ã®ååã§ãããããã㯠JavaScript ã®æ£è¦ã®èå¥åã¾ãã¯æ§é åè§£ãã¿ã¼ã³ã§ããå¿ è¦ãããã¾ãã
valueNçç¥å¯-
夿°ã®åæå¤ã§ããä»»æã®æ£è¦ã®å¼ã«ãããã¨ãã§ãã¾ããããã©ã«ãå¤ã¯
undefinedã§ãã
解説
let ã§å®£è¨ããã夿°ã®ã¹ã³ã¼ãã¯ããã® let 宣è¨ãç´è¿ã®ä¸æ¬å¼§ã§å²ããæ¬¡ã®ããããã®æ§æã§ãã
- ããã㯠æ
switchætry...catchæ- ããããã®
foræã«ããã¦ãletãæã®ãããã¼ã«ããå ´åã«ã¯ãã«ã¼ãã®æ¬ä½ - 颿°æ¬ä½
- éçåæåãããã¯
ä¸è¨ã®ãããããªãå ´åã¯ã次ã®ããã«ãªãã¾ãã
- ã¢ã¸ã¥ã¼ã«ã¢ã¼ãã§å®è¡ä¸ã®ã³ã¼ãã§å ´åã¯ãç¾å¨ã®ã¢ã¸ã¥ã¼ã«
- ã¹ã¯ãªããã¢ã¼ãã§å®è¡ä¸ã®ã³ã¼ãã§ã¯ãã°ãã¼ãã«ã¹ã³ã¼ã
var ã¨æ¯è¼ãã¦ãlet 宣è¨ã«ã¯æ¬¡ã®ãããªéããããã¾ãã
-
let宣è¨ã¯é¢æ°ã§ã¯ãªãããããã¯ã®ã¹ã³ã¼ãã«ãªãã¾ãã -
let宣è¨ã¯ã宣è¨ã®å ´æã«å°éããå¾ã«ã®ã¿ã¢ã¯ã»ã¹ã§ãã¾ãï¼ä¸æçãªãããã¾ã¼ã³ãåç §ï¼ããã®ãããlet宣è¨ã¯ä¸è¬ã«å·»ãä¸ããããªãã¨èãããã¦ãã¾ãã -
let宣è¨ã¯ãã¹ã¯ãªããã®æä¸ä½ã§å®£è¨ãããå ´åã«globalThisã®ããããã£ã使ãã¾ããã -
let宣è¨ã¯ãåãã¹ã³ã¼ãå ã§ã¯ä»ã®ã©ã®å®£è¨ã«ããã¦ãå宣è¨ã§ãã¾ããã -
letã¯æã§ã¯ãªã宣è¨ãå§ãã¾ããããã¯ããããã¯ã®æ¬ä½ã¨ãã¦åç¬ã®let宣è¨ã使ç¨ãããã¨ã¯ã§ããªãã¨ãããã¨ã§ãï¼å¤æ°ã«ã¢ã¯ã»ã¹ããæ¹æ³ããªããããå½ç¶ã§ãï¼ãjsif (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
ãªã let ã¯ã峿 ¼ã¢ã¼ãã§ãªãå ´åãvar ã¾ã㯠function ã§å®£è¨ããéã«èå¥ååã¨ãã¦ä½¿ç¨ãããã¨ãã§ãã¾ãããäºæããªãæ§æä¸ã®ææ§ããé¿ãããããlet ãèå¥ååã¨ãã¦ä½¿ãã®ã¯é¿ãã¦ãã ããã
å¤ãã®ã¹ã¿ã¤ã«ã¬ã¤ãï¼MDN ãå«ãï¼ã§ã¯ã夿°ããã®ã¹ã³ã¼ãå
ã§å代å
¥ãããªãå ´åãlet ããã const ã使ç¨ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã«ããã夿°ã®åï¼å ´åã«ãã£ã¦ã¯å¤ï¼ãä¸å¤ã§ãããã¨ãæç¢ºã«ãªãã¾ãã夿´å¯è½ãªéããªããã£ãåã«ã¯ let ãæ¨å¥¨ãã¦ããå ´åãããã¾ãã
let ãã¼ã¯ã¼ãã«ç¶ããªã¹ãã¯ãã¤ã³ããªã¹ãã¨å¼ã°ããã«ã³ãã§åºåããã¾ããããã§ã«ã³ãã¯ã«ã³ãæ¼ç®åã§ã¯ãªãã= è¨å·ã¯ä»£å
¥æ¼ç®åã§ã¯ããã¾ãããå¾ç¶ã®å¤æ°ã®åæååã¯ããªã¹ãå
ã®å
è¡ãã夿°ãåç
§ã§ãã¾ãã
䏿çãªãããã¾ã¼ã³ (TDZ)
letãconstãclass ã§å®£è¨ããã夿°ã¯ããããã¯ã®å§ã¾ãããã³ã¼ããå®è¡ããã¦å¤æ°ã宣è¨ããåæåãããè¡ã«å°éããã¾ã§ã¯ãã䏿çãªãããã¾ã¼ã³ã(TDZ) å
ã«ããã¨è¨ãã¾ãã
TDZ ã®ä¸ã«ããéã¯ã夿°ã¯å¤ã§åæåããã¦ããããã¢ã¯ã»ã¹ãããã¨ãã㨠ReferenceError ãçºçãã¾ãã夿°ã¯ã宣è¨ãããã³ã¼ãã®è¡ã¾ã§å®è¡ãããã¨ãå¤ã§åæåããã¾ãã夿°å®£è¨ã§åæå¤ãæå®ããªãã£ãå ´åã¯ãundefined ã¨ããå¤ã§åæåããã¾ãã
ãã㯠var ã§å®£è¨ããã夿°ã宣è¨åã«ã¢ã¯ã»ã¹ãããå ´åã« undefined ã®å¤ãè¿ãã®ã¨ã¯ç°ãªãã¾ãã以ä¸ã®ã³ã¼ãã¯ãlet 㨠var ã宣è¨ãããè¡ããåã®ã³ã¼ãã§ã¢ã¯ã»ã¹ãããå ´åã«ãç°ãªãçµæãå¾ããããã¨ã示ãã¦ãã¾ãã
{
// TDZ ã¯ã¹ã³ã¼ãã®å
é ã§å§ã¾ã
console.log(bar); // "undefined"
console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
var bar = 1;
let foo = 2; // TDZ ã®çµäºï¼foo ã«ã¤ãã¦ï¼
}
ã䏿çãã¨ããè¨èã使ããã¦ããã®ã¯ããã®ã¾ã¼ã³ãã³ã¼ããæ¸ãããå ´æï¼ä½ç½®ï¼ã§ã¯ãªããå®è¡ã®é åºï¼æéï¼ã«ä¾åããã¾ã¼ã³ã§ããããã§ããä¾ãã°ãä¸è¨ã®ã³ã¼ãã¯ãlet 夿°ã使ç¨ãã颿°ã¯å¤æ°å®£è¨ã®åã«ç¾ãã¦ãã¾ããããã®é¢æ°ã TDZ ã®å¤ã§å¼ã³åºããã¦ãããããåä½ãã¾ãã
{
// TDZ ã¯ã¹ã³ã¼ãã®å
é ããå§ã¾ã
const func = () => console.log(letVar); // OK
// TDZ ã®ä¸ã§ã¯ãletVar ã«ã¢ã¯ã»ã¹ãã㨠`ReferenceError` ãçºçãã
let letVar = 3; // TDZ ã®çµããï¼letVar ã«ã¤ãã¦ï¼
func(); // TDZ ã®å¤ã§ã®å¼ã³åºã
}
typeof æ¼ç®åã使ç¨ãã¦ä¸æçãªãããã¾ã¼ã³å
ã®å¤æ°ã®åã確èªãããããã¨ããã¨ãReferenceError ãçºçãã¾ãã
{
typeof i; // ReferenceError: Cannot access 'i' before initialization
let i = 10;
}
ããã¯ã宣è¨ããã¦ããªã夿°ã«å¯¾ã㦠typeof ã使ç¨ããå ´åãundefined ã®å¤ã¨è¦ãªãããã®ã¨ã¯ç°ãªãã¾ãã
console.log(typeof undeclaredVariable); // "undefined"
ã¡ã¢:
let ããã³ const 宣è¨ã¯ãç¾å¨ã®ã¹ã¯ãªãããå¦çãããéã«ã®ã¿å¦çããã¾ãã1 ã¤ã® HTML å
ã§ã¹ã¯ãªããã¢ã¼ãã§å®è¡ããã 2 ã¤ã® <script> è¦ç´ ãããå ´åã1 ã¤ç®ã®ã¹ã¯ãªããã¯ã2 ã¤ç®ã¹ã¯ãªããã§å®£è¨ãããæä¸ä½ã® let ã¾ã㯠const 夿°ã«å¯¾ãã TDZ å¶éã®å¯¾è±¡å¤ã§ãããã ãã1 ã¤ç®ã®ã¹ã¯ãªããã§ let ã¾ã㯠const 夿°ã宣è¨ããå ´åã2 ã¤ç®ã¹ã¯ãªããã§å度宣è¨ããã¨å宣è¨ã¨ã©ã¼ãçºçãã¾ãã
å宣è¨
let 宣è¨ã¯ãï¼è¨³æ³¨ï¼åãååã®ï¼ä»ã®å®£è¨ãä¾ãã° let, const, class, function, var, import 宣è¨ã¨åãã¹ã³ã¼ãã«ç½®ããã¨ã¯ã§ãã¾ããã
{
let foo;
let foo; // SyntaxError: Identifier 'foo' has already been declared
}
颿°æ¬ä½å
ã® let 宣è¨ã¯ã弿°ã¨åãååãæã¤ãã¨ã¯ã§ãã¾ãããcatch ãããã¯å
ã® let 宣è¨ã¯ãcatch ã§ãã¤ã³ããããèå¥åã¨åãååãæã¤ãã¨ã¯ã§ãã¾ããã
function foo(a) {
let a = 1; // SyntaxError: Identifier 'a' has already been declared
}
try {
} catch (e) {
let e; // SyntaxError: Identifier 'e' has already been declared
}
Firefox ã®ã¦ã§ãã³ã³ã½ã¼ã«ï¼ãã¼ã« > ã¦ã§ãéçºè
ãã¼ã« > ã¦ã§ãã³ã³ã½ã¼ã«ï¼ãªã©ã® REPL ã§å®é¨ãã¦ããã¨ãã«ãåãååã® let 宣è¨ã 2 ã¤ã®å
¥åã§å®è¡ããã¨ãåãå宣è¨ã¨ã©ã¼ãå¾ãããå ´åãããã¾ãããã®èª²é¡ã«ã¤ãã¦ã¯ãFirefox bug 1580891ã§ãããªãè°è«ãã覧ãã ãããChrome ã³ã³ã½ã¼ã«ã§ã¯ãç°ãªã REPL å
¥åéã§ let ãå宣è¨ãããã¨ãã§ãã¾ãã
switch æã«ã¯ 1 ã¤ã®ãããã¯ãããªããããã¨ã©ã¼ãçºçãã¦ãã¾ãããããã¾ããã
let x = 1;
switch (x) {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError: Identifier 'foo' has already been declared
break;
}
ã¨ã©ã¼ãé¿ããããã«ã¯ãããããã® case ãæ°ãããããã¯æã§å²ãã§ãã ããã
let x = 1;
switch (x) {
case 0: {
let foo;
break;
}
case 1: {
let foo;
break;
}
}
ä¾
>ã¹ã³ã¼ãã®ã«ã¼ã«
let ã§å®ç¾©ããã夿°ã¯ãèªèº«ãå®ç¾©ããããããã¯ã¨ãããã«å«ã¾ãããµããããã¯ãã¹ã³ã¼ãã«ãªãã¾ãããã®ç¹ã«ãã㦠let ã®ãµãã¾ã㯠var ã«ã¨ã¦ãããä¼¼ã¦ãã¾ãã大ããªéãã¯ãvar ã§å®ç¾©ããã夿°ã®ã¹ã³ã¼ãã¯ãããå«ãã§ãã颿°å
¨ä½ã«ãªãã¨ãããã¨ã§ãã
function varTest() {
var x = 1;
{
var x = 2; // åã夿°ã§ã!
console.log(x); // 2
}
console.log(x); // 2
}
function letTest() {
let x = 1;
{
let x = 2; // ç°ãªã夿°
console.log(x); // 2
}
console.log(x); // 1
}
ããã°ã©ã ã颿°ã®æä¸ä½ã«ããã¦ã¯ãlet 㯠var ã¨ã¯ç°ãªããã°ãã¼ãã«ãªãã¸ã§ã¯ãä¸ã«ããããã£ãçæãã¾ãããä¾ã示ãã¾ãã
var x = "global";
let y = "global";
console.log(this.x); // "global"
console.log(this.y); // undefined
䏿çãªãããã¾ã¼ã³ã¨åå¥ã¹ã³ã¼ãã¨çµã¿åãããä¾
ãã®ãããã¯ã® foo ã¯ä¸æçãªãããã¾ã¼ã³ã®ä¸ã«ããã¾ãã
function test() {
var foo = 33;
if (foo) {
let foo = foo + 55; // ReferenceError
}
}
test();
å¤å´ã® var foo ã«å¤ããããããif ãããã¯ã¯å®è¡ããã¾ããããããåå¥ã¹ã³ã¼ãã«ããããã®å¤ã¯ãããã¯ã®å
é¨ã§ã¯å©ç¨ã§ãã¾ãããif ãããã¯ã®å
é¨ã«ããèå¥å foo 㯠let foo ã«ãªãã¾ããå¼ foo + 55 ã§ ReferenceError ãçºçãã¾ãããã㯠let foo ã®åæåãã¾ã å®äºãã¦ããªããã¤ã¾ã䏿çãªãããã¾ã¼ã³ã«ããããã§ãã
ãã®ç¾è±¡ã¯ã以ä¸ã®ãããªç¶æ³ã§ç´ãããããªããã¨ãããã¾ããlet n of n.a ã¨ããå½ä»¤ã¯ããã§ã« for...of ã«ã¼ãã®ãããã¯ã®ãã©ã¤ãã¼ãã¹ã³ã¼ãå
ã«ããã¾ãããã®ãããèå¥å n.a ã¯ãå½ä»¤èªä½ã®æåã®é¨å (let n) ã«ãã 'n' ãªãã¸ã§ã¯ãã®ãããã㣠a ã¨ãã¦è§£æ±ºããã¾ãããã®å®£è¨æã«ã¯ã¾ã å°éã»å®äºãã¦ããªããããã¾ã 䏿çãªãããã¾ã¼ã³å
ã«ããã¨ã¿ãªããã¾ãã
function go(n) {
// n ã¯ããã§ã¯å®ç¾©ããã¦ããªã
console.log(n); // { 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;
{
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 宣è¨ã®çµã¿åããã¯ãvar ããããã¯ã®å
é ã«é
ç½®ããã¦ãããããSyntaxError ã«ãªãã¾ããããã«ãã£ã¦ã夿°ãæé»çã«å宣è¨ãããããã§ãã
let x = 1;
{
var x = 2; // å宣è¨ã®ãã SyntaxError
}
æ§é åè§£ã«ãã宣è¨
ããããã® = ã®å·¦å´ããã¤ã³ããã¿ã¼ã³ã§ããå¯è½æ§ãããã¾ãããã®ãã¨ã¯ãè¤æ°ã®å¤æ°ãä¸åº¦ã«ä½æãããã¨ãã§ããã¨ãããã¨ã§ãã
const result = /(a+)(b+)(c+)/.exec("aaabcc");
let [, a, b, c] = result;
console.log(a, b, c); // "aaa" "b" "cc"
詳ããæ å ±ã¯æ§é åè§£ãåç §ãã¦ãã ããã
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-let-and-const-declarations > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
varconst- å·»ãä¸ã
- ES6 In Depth:
letandconst- hacks.mozilla.org (2015) - Breaking changes in
letandconstin Firefox 44 - blog.mozilla.org (2015) - You Don't Know JS: Scope & Closures, Ch.3: Function vs. Block Scope - Kyle Simpson
- What is the Temporal Dead Zone? - Stack Overflow
- What is the difference between using
letandvar? - Stack Overflow - Why was the name 'let' chosen for block-scoped variable declarations in JavaScript? - Stack Overflow