#javascript
#javascript
Вопрос:
У меня есть массив узлов, которые будут красиво заполнены obj
s
var nodesArray = [];
var obj = function(nodeSpan){
this.nodeS = nodeSpan;
this.doThings = function(){
console.log(this.nodeS);
};
}
Я вставил много obj
«s в nodeArray
var newObj = new obj(thisIsASpan) ///trust me that's a span
nodesArray.push(newObj);
//etc
Я вызываю функцию сопоставления на каждом узле, добавляя прослушиватель событий.
Array.prototype.map.call(nodesArray, function(obj, index) {
obj.nodeS.addEventListener('click', function(obj, index) {
nodesArray[index].doThings(); ////Throws error in title.
});
});
Я нажимаю на один из проклятых промежутков.
Я получаю ошибку в заголовке, затем я иду в комнату отдыха, затем у меня сбой.
Комментарии:
1. Я бы начал с консоли. выйдите из nodesArray, а затем посмотрите, работает ли он так, как вы думаете .. затем консоль. регистрируйте индекс и объект
2. @jdave индекс был правильно передан в
addEventListener
3. Кстати, вам не нужно использовать
Array.prototype.map.call
, когда ваша переменная содержит реальный массив. Просто используйтеnodesArray.map(...)
. Сложный синтаксис необходим только для объектов, похожих на массивы.4. @Barmar Я предпочитаю этот способ, так он всегда работает.
Ответ №1:
Вы не должны добавлять obj и index при определении щелчка, они устанавливаются при запуске щелчка. В вашем случае первым аргументом является объект события, а второй не определен, поскольку у click есть только один аргумент.
Array.prototype.map.call(nodesArray, function(obj, index) {
obj.nodeS.addEventListener('click', function(event) {
nodesArray[index].doThings();
});
});
Комментарии:
1. Я обнимаю @epascarello
2. Но если серьезно, почему тогда addEventListener имеет доступ к индексу? И почему я не смог бы передать index явно?
3. потому что переменные находятся в одной и той же области блока.