7

I want to get a function's name in an arrow function

Actually, if we write

function abc(){
  let funcName = arguments.callee.name
}

But in an arrow function

abc: ()=>{
  let funcName = arguments.callee.name
}

funcName return ''

7
  • Isn't it an anonymous function ? Commented Aug 17, 2021 at 4:34
  • 2
    This is kind of like asking what is the variable name of the number 12 Commented Aug 17, 2021 at 4:37
  • @MaxZoom I have added function name Commented Aug 17, 2021 at 4:37
  • 1
    Are you sure you don't get an error when you access arguments object inside the arrow function? Commented Aug 17, 2021 at 4:45
  • 1
    The name of the function is "abc:", assigned to the arrow function when it was compiled as the abc property of a parent object. You could just hard code it in the arrow function if you want. Commented Aug 17, 2021 at 6:06

1 Answer 1

8
  • Arrow functions do not have an arguments binding. But they have access to the arguments object of the closest non-arrow parent function. Named and rest parameters are heavily relied upon to capture the arguments passed to arrow functions.
function dummy() {
  return (() => arguments.callee.name)(); // dummy
}
  • The value of this inside an arrow function remains the same throughout the lifecycle of the function and is bound to the value of the closest this-providing environment.
const obj = {
  // like a normal function, returns obj - defines like obj.a = function a() {};
  a() { return this },
  // arrow function uses global as this
  b: () => { return this },
};
console.log(obj.a() == obj) // true
console.log(obj.b() == obj) // false
console.log(obj.b() == window) // true
  • Arrow functions can never be used as constructor functions. Hence, they can never be invoked with the new keyword. As such, a prototype property does not exist for an arrow function.

Therefor, the only way to get the name of an arrow function is from accessing the direct reference to it.

const arrow = () => arrow.name;
console.log(arrow()); // "arrow"

const obj = {
  a: () => obj.a.name;
}
console.log(obj.a()); // "a"
Sign up to request clarification or add additional context in comments.

2 Comments

Other than "your code code does not work (because arrow functions have no arguments)", I don't see how this answers the question about getting the .name
"is always bound to the value of this in the closest non-arrow parent function." Probably good enough for most use cases but just for completeness: It's the closest "this-providing" environment, which can be the global environment or a module environment (not that those this values would be very interesting, but still).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.