◆ ブロックスコープで再定義禁止
◆ ループで共通の変数が使われるところが違ってる

この機能 IE でも大丈夫だっけ? と試すときに ES2015 のアロー関数などを ES5 ように書き直して 試しているのですが const と let を修正忘れたまま 実行していたのに動いてるのを発見しました


IE11 でも使えたんだ

ブロックスコープで再定義禁止というところも ES2015 と同じです

{
const value = 1
}
console.log(typeof value) // undefined

for(let i=0;i<3;i++){
}
console.log(typeof i) // undefined

const value = 1
value = 2

const への代入

let value = 1
let value = 2

let/const の再定義


なんかエラーメッセージが雑な感じです

違うところ

完全に一緒だといいのですけど ちょっとした違いもあります

const arr = []
for(let i=0;i<2;i++){
arr.push(function(){return i})
}
console.log(arr.map(function(e){return e()}))
// [2, 2]

for(const v in [1, 2]){
}

const は初期化する必要があります

こっちは丁寧なエラーメッセージです

for 中のループ変数はループごとに別スコープとなりません
なので 各ループで無名関数を作ってあとから呼び出すと i は全部同じ値となります

また const を for-in 中で使えません
これも各ループごとにスコープを作らないことが理由です
IE でも動くような JavaScript を書くときは for のスコープの違いだけ気をつければ const/let も使えますね