0

Это аналог работы метода forEach. Метод forEach, как известно, может принимать следующие параметры (callback[, thisArg]). Вот функция, которая является аналогом данного метода.

Как добавить еще и параметр thisArg (Необязательный параметр. Значение, используемое в качестве this при вызове функции callback)?

var array = [1, 2, 3, 4, 5, 6];
console.log(customForEach(array, func));

function customForEach(src, callback) { for (var i = 0; i < src.length; i++) { callback(src[i], i, src); } }

function func(item, i, arr) { console.log(i + ' Элемент: ' + item + '(массив ' + arr + ')'); }

1 Answers1

2

При использовании функций call и apply можно задать значение this напрямую, передав его первым параметром.

Разница между этими методами в способе передачи параметров:

  1. Если количество параметров известно заранее, то проще использовать функцию call, в которой параметры вызываемой функции указываются через запятую

    callback.call(thisArg, src[i], i, src);
    
  2. Если список параметров собирается динамически, то лучше использовать apply, которая вторым параметром принимает array-like объект либо массив с передаваемыми параметрами.

    callback.apply(thisArg, [src[i], i, src]);
    

Пример:

var o = {
  a: 1,
  b: 2,
  c: 3
}
console.log('Пример с передачей this');
customForEach(Object.keys(o), func, o);

var array = [1, 2, 3, 4, 5, 6]; console.log('Пример без передачи this'); customForEach(array, func2);

function customForEach(src, callback, thisArg) { for (var i = 0; i < src.length; i++) { callback.call(thisArg, src[i], i, src); } }

function func(item, i, arr) { console.log(i + ' Элемент: ' + item + '(массив ' + arr + ')' + ', значение: ' + this[item] + '(this:' + JSON.stringify(this) + ')'); }

function func2(item, i, arr) { console.log(i + ' Элемент: ' + item + '(массив ' + arr + ')'); }

.as-console-wrapper {
  top: 0;
  max-height: 100% !important;
}

Подробнее про смену контекста можно узнать в вопросе:

Потеря контекста вызова

Grundy
  • 81,538