Zaczynamy pisać polyfill dla funkcji filter. Zakładam, że przerobiliśmy poprzednie lekcje i nie będzie trzeba wszystkiego tłumaczyć. Do dzieła.

Ok, nasz polyfill:

Array.prototype.myFilter = function(callback, thisArg){

    var context = thisArg || globalThis;

    var arr = [];

    for(i=0; i< this.length; i++){
        if(callback.call(context, this[i], i, this)){

            arr.push(this[i])
        }
    }
    return arr;
}

A teraz użycie:

let arr = [1,2,3];
let filtered = arr.myFilter(function(el){
    return el + this.num !== 13;
}, {num: 10});

console.log(filtered.toString());
//1,2

thisArg może sprawiać problemy przy funkcjach strzałkowych:

let arr = [1,2,3];
let filtered = arr.myFilter((el) => el + this.num, {num: 10});

console.log(filtered.toString());
//""

Dzieje się tak, ponieważ funkcja strzałkowa nie może mieć własnego this.

Napiszemy sobie funkcję, która sprawdza, czy podany callback jest strzałkowy czy nie:

function isArrowFunc(func){
    return func.toString().includes("=>");
}

console.log(isArrowFunc((el) => el + this.num));
//true

console.log(isArrowFunc(function(el){
    return el + this.num;
}));
//false

Dodam, że oryginalna funkcja filter (oraz map) mają te same bolączki – nie można przypisać thisArg do strzałkowej.