読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

letはブロックに紐付く

javascript/node.js

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にしました