This content originally appeared on DEV Community and was authored by Manuel Artero Anguita 
Today, we’ve decided to use arrow functions exclusively at work.
We have a common ESLint config, and the team voted to unify this rule across all projects.
And honestly I’m not a fan of this particular rule
Personally… function declarations feels more expressive, at least for top-level symbols:
some-screen-of-my-app.tsx
import {} ...
export function SomeScreen(props: Props) {
const { myContext } = useMyContext()
const [state, setState] = useState()
const doSomething = () => { ... }
const handleSomething = () => { ... }
return <>...</>
}
function SomeInternalComponent() { ... }
This is how i’m used to write components: declaring a function feels like a chapter title in a novel.
function Chapter3(storySoFar: Props) {
// where the Hero meets the Villain
}
But I do understand the team need: depending on the original author of a module we might find at first level const () => {} or function.
The main argument is that “arrow functions are more readable” (which i disagree with)
import {} ...
const SomeInternalComponent = () => { ... }
export const SomeScreen = (props: Props) => {
const { myContext } = useMyContext()
const [state, setState] = useState()
const doSomething = () => { ... }
const handleSomething = () => { ... }
return <>...</>
}
I tried to find some technical advantage to support my preference… some nerd *pitimini* [ something small or insignificant ] that moves the balance on my benefit but since we all agree on the following:
- No Classes (just functions)
- No global stuff (modern modules)
- No
this
There are no significant differences between each one.
Diving into Details:
const foo = () => { ... }
- No hoisting
- function’s name is derived from the variable’s name (
"foo") - Can’t be overwritten later like
foo=... - Doesn’t create the prototype object
foo.prototype - Can’t be used as a constructor
new foo() - Doesn’t have
arguments -
thisvalue is defined by where the function is declared
function foo() { ... }
- Hoisting
- function name is obv.
- Can be overwritten like
foo = ... - Creates the object prototype
foo.prototype -
newis allowed like:new foo()(which would link the prototype) -
thisvalue is defined by how the function is called
In the end, I prefer the Superior Clarity of function for top-level components, but the will of the many prevails.
Kidding, I will adapt. Having a unified style will help to maintain a cohesive codebase.


.
thanks for reading
This content originally appeared on DEV Community and was authored by Manuel Artero Anguita 