Как стать автором
Обновить

Комментарии 7

Это отдельный и древний вид спорта, который зачастую жертвует легкостью понимания кода в угоду его размеру.
function forEach(array, action) {
  for (var i = 0; i < array.length; i++)
    action(array[i]);
}
forEach(["Тили", "Мили", "Трямдия"], console.log);


но ведь нельзя просто так взять и передать параметром console.log, выдаст TypeError: Illegal invocation

Как вариант
forEach(["Тили", "Мили", "Трямдия"], console.log.bind(console));
console ожидает в this видеть именно console, а не window, поэтому тут чуточку сложнее.
Я немного о другом. Результат моего примера будет [1, NaN, NaN], однако мы хотели сделать [1,2,3] и это главный tricky case, когда функция map ждет на вход функцию с сигнатурой (value, index, array), а в это время функция parseInt внезапно ожидает на вход два аргумента, первый число для конвертации, второй основание степени. Тут-то мы и обломаемся и bind нас здесь не спасет.
Из:
['1','2','3'].map(parseInt);

Т.к. код станет таким:
['1','2','3'].map(function (value, index) {
   return parseInt(value, index); // index у нас значение позиции в массиве
}); // out: [1, NaN, NaN]


Только так можно спастись:
['1','2','3'].map(function (key) {
   return parseInt(key);
}); // out: [1,2,3]
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации