this
внутри функции стрелки ссылается на тот же this
в содержащем его блоке.Здесь содержащий блок является верхним уровнем, где this
относится к window
, а window.length
равно 0
.
console.log(this === window);
console.log(window.length);
Итак, ваш код эквивалентен:
Array.prototype.maap = function(transform) {
let mapped = [];
for (let element of this) {
mapped.push(transform(element));
}
return mapped;
}
console.log(this.length);
console.log([0, 2, 3].maap(n => n / 0));
0 / 0
равен undefined
, а большинство других чисел / 0
равно Infinity
(или -Infinity
).
Если выЕсли вы хотите эмулировать поведение Array.prototype.map
с помощью this
, второй аргумент, передаваемый maap
, должен иметь значение this
, с которым вызывается обратный вызов:
Array.prototype.maap = function(transform, thisVal) {
let mapped = [];
for (let element of this) {
mapped.push(transform.call(thisVal, element));
}
return mapped;
}
const arr = [0, 2, 3];
console.log(arr.maap(
function(n){ return n / this.length; },
arr
));