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.