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); }