Создание собственного ForEach () javascript - элемент не определен - PullRequest
0 голосов
/ 25 сентября 2018

Я делаю собственную реализацию forEach в javascript, с единственной целью - лучше понять язык.Чтобы быть более конкретным, временная цель - лучше понять обратные вызовы.

Вот как далеко я продвинулся, пока не застрял.

function myForEach(array, callback) {
  for (let i = 0; i < this.length; i++) {
    callback(array[i]);
  }
}

function callback(element) {
  console.log(element); //insert logic
}

const array = [2, 4, 6, 8, 10];
arr.myForEach(array, callback(element));

Я получаю следующую ошибку при запуске в узле:

ReferenceError: element is not defined
    at Object.<anonymous> (C:\Users\Jonas\Desktop\FLEXBOX\test.js:54:31)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Function.Module.runMain (module.js:694:10)
    at startup (bootstrap_node.js:204:16)
    at bootstrap_node.js:625:3

Я подозреваю, что это потому, что когда функция вызывается, элемент задается как параметрв функции обратного вызова не создается.Что имеет смысл, но реальный цикл forEach при вызове еще не передает созданное значение?

arr.forEach((element /*does not exist yet?*/) => {
    console.log(element);
});

Я также пытался вызвать метод с лямбда-выражением, которое также не дает правильного результата.Но другая ошибка

arr.myForEach(array, (element) => {
    console.log(element);
});

, тогда выдает ошибку:

TypeError: arr.myForEach is not a function
    at Object.<anonymous> (C:\Users\Jonas\Desktop\FLEXBOX\test.js:58:5)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Function.Module.runMain (module.js:694:10)
    at startup (bootstrap_node.js:204:16)
    at bootstrap_node.js:625:3

Ответы [ 6 ]

0 голосов
/ 25 сентября 2018

Есть несколько способов сделать это.Я думаю, что вы пытались пойти на изменение самого массива, чтобы иметь вашу функцию, и в этом случае приведенный ниже код делает это.Обратите внимание, что я назначаю функцию свойству экземпляра массива.Вы также можете изменить Array.prototype ... но это, как правило, считается опасной и необдуманной идеей.(примечание: в вашем коде вы не передаете обратный вызов в функцию, вы вызываете callback(element) и передаете результат (неопределенный) в функцию.

function myForEach(callback) {
    for (let i = 0; i < this.length; i++) {
        callback(this[i]);
    }
}

function callback(element) {
    console.log(element); //insert logic
}

const arr = [2, 4, 6, 8, 10];
arr.myForEach = myForEach;
arr.myForEach(callback);

Другой способ сделать это - передать массив и обратный вызов в функцию, и в этом случае вы не захотите использовать this.

function myForEach(array, callback) {
    for (let i = 0; i < array.length; i++) {
        callback(array[i]);
    }
}

function callback(element) {
    console.log(element); //insert logic
}

const array = [2, 4, 6, 8, 10];
//myForEach(array, callback(element));
myForEach(array, callback); 
0 голосов
/ 25 сентября 2018

У вас есть несколько ошибок, проверьте это:

function myForEach(array, callback) {
    for (let i = 0; i < array.length; i++) { 
        callback(array[i]);
    }
}

function callback(element) {
    console.log(element); //insert logic
}

const array = [2, 4, 6, 8, 10];
myForEach(array, callback); 

Ошибки (см. Комментарии):

function myForEach(array, callback) {
  for (let i = 0; i < this.length; i++) { // what is this? You need array.length
    callback(array[i]);
  }
}

function callback(element) {
  console.log(element); //insert logic
}

const array = [2, 4, 6, 8, 10];
arr.myForEach(array, callback(element)); 
// arr.myForEach is not possible, because myForEach is not a method of JS arrays 
// callback(element) this invokes a function, you just need to pass it like callback (without parentheses)
0 голосов
/ 25 сентября 2018

Причина, по которой вы получаете эту ошибку, состоит в том, что «элемент» не ссылается ни на что в этом случае.Вам нужно перебрать массив, а затем добавить логику к каждому элементу, скажем, что вы хотите добавить два для обучения элемента вашего массива, ваша функция обратного вызова может выглядеть примерно так:

function specificAFunction( arr ) {
let arrayResult = [];
arr.forEach( element => arrayResult.push(element + 2) );
return arrayResult;
};

а затем вы можете вызвать вашу первую функцию с помощью функции и массива значений:

const values = myFilter(myArray, specificAFunction);
0 голосов
/ 25 сентября 2018

Вот как вы можете этого достичь

    Array.prototype.myForEach = function(callback) {
      for (let i = 0; i < this.length; i++) {
        callback(this[i]);
      }
    };
    
    function callback(element) {
      console.log(element); //insert logic
    }
    
    var array = [2, 4, 6, 8, 10];
    array.myForEach( callback);

ошибка element not defined is because in last line you use 'callback(element)', в этом элементе строки не определено

и чтобы иметь возможность вызывать метод для массивов, таких как array.myForEach, вы должны прикрепитьПрототип

ПРИМЕЧАНИЕ. Не рекомендуется менять встроенные прототипы.Спасибо за комментарии, ребята

0 голосов
/ 25 сентября 2018
const arr = [2, 4, 6, 8, 10];
myForEach(arr, callback); 

Функция, которую вы написали, должна вызываться описанным выше способом.

0 голосов
/ 25 сентября 2018

элемент не определен

Вы получаете это, потому что element не определяется, когда он встречает эту строку:

arr.myForEach(array, callback(element));`

Этот код говоритнемедленно вызовите callback, передав переменную с именем element (которая не существует), затем возьмите результат обратного вызова и передайте его в myForEach

arr.myForEach не является функцией

Вы получаете это, потому что вы не изменили Array.prototype, чтобы иметь функцию myForEach, и поэтому arr.myForEach не определено.Как вы написали myForEach, вы должны вызывать его так:

myForEach(array, (element) => console.log(element))

или

myForEach(array, callback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...