私は本のJqueryのいくつかの例をjavascriptにリファクタリングしてjavascriptを学んでいます。次のコードでは、クリックリスナーをタブに追加し、ユーザーがタブをクリックしたときにクリックリスナーをアクティブに変更します。私のjavascriptコードでは "これ"を理解しようとしています(あるものは動作し、もう一方は動作しません)
var tabs = document.querySelectorAll(".tabs a span");
var content = document.querySelectorAll("main .content li");
for (var tabNumber = 0; tabNumber <= 2; tabNumber++) {
tabs[tabNumber].addEventListener("click", function (event) {
for (var i = 0; i < tabs.length; i++) {
tabs[i].classList.remove("active");
}
tabs[tabNumber].classList.add("active");
for (var i = 0; i < content.length; i++) {
content[i].innerHTML = "";
}
event.preventDefault();
});
}
私はそれを実行したときにこれがundefined error
を返します。しかし、tabs[tabNumber].classList.add("active")
をthis.classList.add("active")
に置き換えてみました。
なぜ前のコードは機能しませんか?私が見る限り、彼らは同じことを指しており、はコードのその時点でそれがtabs[0]
であるので動作するはずです。
イベントハンドラ内でconsole.log(tabNumber)を使用した場合、クリックしたアイテムに関係なく3であることがわかります。 – nnnnnn
forループを可能な限り使うように 'let'を使いますが、クロージャやJSコードで参照する場所で問題を解決できます。 – Gary