This site uses tracking technologies. You may opt in or opt out of the use of these technologies.

Back to Javascript

Defining functions in Javascript (function keyword, arrow functions)

In JavaScript, functions can be defined using several different syntaxes, including the function keyword and arrow functions. Each has its own use cases and behaviors.

1. Using the function keyword

Function Declaration

A function declaration is a straightforward way to define a named function.

function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("Amir")); // Output: Hello, Amir!
  • Hoisting: Function declarations are hoisted to the top of their scope, meaning they can be called before they are defined in the code.

  • Context (this binding): this in function declarations refers to the object that called it, making it useful in object-oriented code.

Function Expression

A function expression defines a function inside a variable and can be named or anonymous.

const greet = function(name) {
return `Hello, ${name}!`;
};
console.log(greet("Amir")); // Output: Hello, Amir!
  • Not Hoisted: Unlike function declarations, function expressions are not hoisted, so they cannot be used before they are defined.

  • Context: Behaves similarly to function declarations in terms of this binding.

2. Arrow Functions

Arrow functions offer a more concise syntax, but they come with different behavior for this.

const greet = (name) => {
return `Hello, ${name}!`;
};
console.log(greet("Amir")); // Output: Hello, Amir!

For even more concise syntax, if the function has only one expression, you can omit the braces and return keyword:

const greet = (name) => `Hello, ${name}!`;
console.log(greet("Amir")); // Output: Hello, Amir!
  • this binding: Arrow functions do not have their own this context. Instead, they inherit this from the outer (enclosing) scope, which is useful in callbacks or when working with methods in classes.

  • No arguments object: Arrow functions do not have their own arguments object, which can be limiting when working with variable numbers of parameters.

Summary of Key Differences:

SyntaxHoistingthis ContextArguments Object
Function DeclarationHoistedDynamic (based on caller)Available
Function ExpressionNot HoistedDynamic (based on caller)Available
Arrow FunctionNot HoistedLexical (inherited)Not Available

Arrow functions are ideal for short, inline functions or callbacks, especially when you need lexical this behavior, while function declarations are better when hoisting is desired or the function needs to be easily referenced by name.