Loading...
Loading...
Shorter syntax, lexical this, and the most common function style in modern JS.
From verbose to concise — step by step.
// Traditional function: function add(a, b) { return a + b; } // Arrow function (full form): const add = (a, b) => { return a + b; }; // Arrow function (concise): const add = (a, b) => a + b;
Arrow functions replace the function keyword with =>. When there's a single expression, you can omit { } and return.
Skip return and braces for single expressions.
// Concise body (implicit return): const square = x => x * x; const greet = name => `Hello, ${name}!`; const isEven = n => n % 2 === 0; // Block body (explicit return needed): const process = (x) => { const doubled = x * 2; const formatted = `Result: ${doubled}`; return formatted; // must use return! }; // ⚠️ Returning an object literal — wrap in (): const makeUser = (name) => ({ name, id: Date.now() }); // ^--- () needed! Otherwise { } = block // Without (): const broken = (name) => { name, id: Date.now() }; // This is a block with a label, returns undefined! // Common in array methods: const names = users.map(u => u.name); const adults = users.filter(u => u.age >= 18); const total = prices.reduce((sum, p) => sum + p, 0);
Arrow functions don't have their own this — they inherit it.
// Regular function: 'this' depends on HOW it's called const timer = { seconds: 0, start() { setInterval(function() { this.seconds++; // ❌ 'this' = window/undefined console.log(this.seconds); // NaN }, 1000); } }; // Arrow function: 'this' is from WHERE it's defined const timer = { seconds: 0, start() { setInterval(() => { this.seconds++; // ✓ 'this' = timer object console.log(this.seconds); // 1, 2, 3... }, 1000); } };
Arrow functions capture 'this' from their enclosing scope at definition time. This is called lexical this.
Things arrow functions can't do.
// ❌ No own 'this' — can't be used as methods: const obj = { name: "Alice", greet: () => `Hi, I'm ${this.name}`, // 'this' = outer scope! }; obj.greet(); // "Hi, I'm undefined" // ✓ Use regular method syntax instead: const obj = { name: "Alice", greet() { return `Hi, I'm ${this.name}`; } }; // ❌ Can't be used as constructors: const Person = (name) => { this.name = name; }; new Person("Alice"); // ❌ TypeError: not a constructor // ❌ No 'arguments' object: const fn = () => console.log(arguments); // ❌ ReferenceError // Use rest params instead: const fn = (...args) => console.log(args); // ❌ Can't be generators: const gen = *() => { yield 1; }; // ❌ SyntaxError // ❌ No prototype property: const arrow = () => {}; arrow.prototype; // undefined
Arrow vs regular functions — a simple guide.
Use arrow functions for:
arr.map(x => x * 2).then(data => ...)Use regular functions for:
obj.method() {}function Person() {}argumentsthis = elementCommon questions about arrow functions.