아래 코드에서 j
의 값은 항상 마지막 반복으로 설정됩니다. 이미 IIFE를 사용하고 있지만 여전히 예상치 못한 동작을 제공합니다. 내가 잘못하고 있는게 있나요?루프에서 addEventListener가 IIFE와 작동하지 않음
(function(j) {
deleteButton.addEventListener('click',function() {
console.log(j); // j is the parameter
});
})(j);
또는 상당히 코멘트에 주목 @torazaburo, 당신은 let
키워드를 사용할 수 있습니다 : 당신이 폐쇄와 함께 수행 할 작업을
function renderUsers(users) {
const frag = document.createDocumentFragment();
const userList = document.getElementById('user-list');
// Create and append all the users on the user list
for (var j = 0; j < users.length; j++) {
var item = document.createElement('li');
var division = document.createElement('div');
var userName = document.createElement('span');
var deleteButtonAnchor = document.createElement('a');
var deleteButton = document.createElement('i');
deleteButton.classList.add('material-icons');
deleteButton.textContent = 'delete_forever';
(function() {
deleteButton.addEventListener('click',function() {
console.log(j);
});
})();
deleteButtonAnchor.appendChild(deleteButton);
division.appendChild(userName);
division.appendChild(deleteButtonAnchor);
item.appendChild(division);
userName.appendChild(document.createTextNode(users[j].name.first+' '+users[j].name.last));
frag.appendChild(item);
}
userList.appendChild(frag);
}
IIFE에'j '를 전달하지 않습니다. 루프에서 함수를 만드는 것은 나쁜 습관으로 간주됩니다. 대신 외부 함수를 사용하십시오. http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – Teemu