Неперехваченная ошибка типа: не удается прочитать значения свойства undefined

#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. потому что переменные находятся в одной и той же области блока.