関数をイベントリスナーに追加するときの違いと、その影響を理解しようとしています。
var buttons = document.getElementsByTagName('button');
for (i = 0, len = 3; i < len; i++) {
    var log = function(e) {
        console.log(i);
    }
    buttons[0].addEventListener("click", log);
}
for (i = 0, len = 3; i < len; i++) {
    function log(e) {
        console.log(i);
    }
    buttons[1].addEventListener("click", log);
}
最初のボタンはconsole.log3 回発火しますが、2 番目のボタンは 1 回だけ発火します。
通常の状況でイベント リスナーに関数を追加する場合、なぜ、また何を使用する必要がありますか?