Uczymy się pisać funkcję konwertującą funkcje strzałkowe do zwykłych funkcji anonimowych. Do dzieła.

Z poprzedniej lekcji mamy to:

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

console.log(isArrowFunc(function(){
    console.log("Hello world");
}));
//false

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

Tworzymy funkcję – dzielimy na args i body:

function convertArrowToRegular(func){

    let funcString = func.toString();
    let [args, body] = funcString.split("=>");

    let argsy;
}

Z args usuwamy zbędne nawiasy (jeżeli istnieją) i zbędne spacje:

args = args.trim();
    
if(args.startsWith("("))
   args = args.slice(1);
 
if(args.endsWith(")"))
    args = args.slice(0,-1);
    
args.replace(" ", "");

Jeżeli nie ma argsów (pusty string albo spacja) to pusta tablica. Jeżeli są – obsługujemy je (do tablicy i trim):

if(args === "" || args === " ")
        argsy = [];
else {
  argsy = args.split(",");
  argsy = argsy.map((el) => el.trim());
}

Zawsze to sobie możemy zdebugować i wrzucić najróżniejsze przykłady funkcji strzałkowych, aby zrozumieć dlaczego takie kroki wykonujemy.

Dalej:

body = body.trim();

    if(body.startsWith("{") && body.endsWith("}")){
        body = body.slice(1);
        body = body.slice(0, -1);
    } else {
        body = "return " + body + ";";
    }

    return new Function(argsy, body);
}

Całość tak się prezentuje:

function convertArrowToRegular(func){
    let funcString = func.toString();
    let [args, body] = funcString.split("=>");

    let argsy;

    args = args.trim();
    
    if(args.startsWith("(")){
        args = args.slice(1);
    }

    if(args.endsWith(")")){
        args = args.slice(0,-1);
    }

    args.replace(" ", "");

    if(args === "" || args === " ")
        argsy = [];
    else {
        argsy = args.split(",");
        argsy = argsy.map((el) => el.trim());
    }

    body = body.trim();

    if(body.startsWith("{") && body.endsWith("}")){
        body = body.slice(1);
        body = body.slice(0, -1);
    } else {
        body = "return " + body + ";";
    }

    return new Function(argsy, body);
}

Testujemy i sprawdzamy co dostajemy:

const addTwo = convertArrowToRegular((a, b) => a + b);

console.log(addTwo(1,2));
//3

console.log(addTwo.toString());

// function anonymous(a,b
// ) {
// return a + b;
// }

const add2 = convertArrowToRegular((a) => a + 2);

console.log(add2.toString());

// function anonymous(a
// ) {
// return a + 2;
// }

const foo = convertArrowToRegular(( ) => 42);

console.log(foo.toString());

// function anonymous(
// ) {
// return 42;
// }

const func123 = convertArrowToRegular((a, b) => {
    return a + b });

console.log(func123.toString());

// function anonymous(a,b
// ) {
//
//
//     return a + b 
// }

Jest ok.