Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

letはブロックに紐付く

letはブロックに紐付くため、varではできなかった事が出来るようになります。

実際のところ

var messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"];

for (var i = 0; i < messages.length; i++) {
  setTimeout(function () {
    cat.say(messages[i]);
  }, i * 1500);
}

これ、例えば以下のサイトなんかで実行すると……
Edit fiddle - JSFiddle
"undefined"と1.5秒おきに3回出るだけ。
これはvarの仕様で、messages[i]が解決されずそういう挙動をします。
具体的には、変数iがsetTimeout内のfunctionに渡されないためです。
varは関数に紐付いてるそうで……。
対処療法でmessageに対してforEachを掛ければいいそうですが……
forを使う場合、letに置き換えるのも手です。

letの場合、ブロックにひも付くため上記のものは以下のように変更できます。*1

const messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"];

for (let i = 0; i < messages.length; i++) {
  setTimeout(function () {
    cat.say(messages[i]);
  }, i * 1500);
}

*1:個人的好みで、スクリプト上変更されないmessageはconstにしました