Я не понимаю, почему $ ('selector'). Html () работает иначе, чем document.querySelectorAll, когда используется внутри цикла.Я задаю этот вопрос, потому что считаю, что ответ может помочь мне лучше понять замыкания.
Скажем, у меня есть HTML-файл с неупорядоченным списком, содержащим 3 пустых элемента списка.
<ul>
<li></li>
<li></li>
<li></li>
</ul>
ДалееЯ хочу вставить некоторые значения в элементы списка, используя восходящий цикл и jQuery, например так:
$(document).ready(function () {
for (let i = 0; i < 3; i++) {
$('ul li').html(i); /// Output: all list items are filled with 2
}
})
Все элементы списка теперь содержат «2», что не соответствует ожиданиям.Я ожидал 0, 1, 2.
Затем я также попробовал то же самое в JS, и результат был другим
window.onload = function () {
let list = document.querySelectorAll('ul li');
for (let i = 0; i < 3; i++){
list[i].innerHTML = i; //Output: 0 1 2
}
}
Чтобы найти исправление для версии jQuery на моемкод Я проверил раздел MDN о замыканиях и нашел это исправление:
$(document).ready(function () {
for (let i = 0; i < 3; i++) {
$('ul li').html(foo(i)); /// output: 0 1 2
}
function foo(n) {
return function bar(n) {
return n;
}
}
})
Даже если это работает в данный момент, я хотел бы знать, почему использование $ (). html () работает иначе, чемпростой пример JS?