2017-01-16 5 views
0

以下のコードでは、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); 
} 
+1

あなたはIIFEに 'j 'を渡していません。ループ内で関数を作成することも、悪い習慣とみなされます。代わりに外部関数を使用してください。 http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – Teemu

答えて

2

は、のような、パラメータとして反復変数を渡すことですクロージャを作成する必要性を排除するために変数を反復するためです。 letキーワードの詳細はhereです。ただし、古いブラウザでは実装されていないES6機能であるため、最初にトランスバイルする必要があります(たとえば、babelを使用するなど)。

+0

なぜdownvotedを参照してください? –

+0

ここでは閉鎖の必要は全くないので、問題全体が 'for(let ...')で解決できるので、 –

+0

確かに問題は "私が間違っていることはありますか?"です。答えは、提供されたコードで何が間違っているかを示しています –

関連する問題