Function
Definition
A Function is a callable object that executes a block of code. Functions are first-class objects in JavaScript, meaning they can be assigned to variables, passed as arguments, and returned from other functions.
> typeof function() {}
"function"
Using functions
Function Declaration
function greet(name) {
return `Hello, ${name}!`
}
Function Expression
const greet = function(name) {
return `Hello, ${name}!`
}
Arrow Function (ES6+)
const greet = (name) => {
return `Hello, ${name}!`
}
// Shorthand for single expression
const greet = (name) => `Hello, ${name}!`
// Single parameter (no parentheses needed)
const square = x => x * x
Function Constructor
const greet = new Function('name', 'return `Hello, ${name}!`')
Function parameters
Default Parameters
function greet(name = "Guest") {
return `Hello, ${name}!`
}
greet() // "Hello, Guest!"
greet("Alice") // "Hello, Alice!"
Rest Parameters
function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0)
}
sum(1, 2, 3, 4) // 10
Destructuring Parameters
function greet({ name, age }) {
return `Hello, ${name}, age ${age}!`
}
greet({ name: "Alice", age: 30 }) // "Hello, Alice, age 30!"
Operations on functions
Function methods
call()
Calls a function with a specified this value and arguments provided individually.
function greet() {
return `Hello, ${this.name}!`
}
const person = { name: "Alice" }
greet.call(person) // "Hello, Alice!"
apply()
Calls a function with a specified this value and arguments provided as an array.
function sum(a, b, c) {
return a + b + c
}
sum.apply(null, [1, 2, 3]) // 6
bind()
Creates a new function with a specified this value and initial arguments.
function greet() {
return `Hello, ${this.name}!`
}
const person = { name: "Alice" }
const boundGreet = greet.bind(person)
boundGreet() // "Hello, Alice!"
Arrow functions vs regular functions
this Binding
Arrow functions don't have their own this—they inherit it from the enclosing scope:
const obj = {
name: "Alice",
regular: function() {
return this.name // "Alice" (this refers to obj)
},
arrow: () => {
return this.name // undefined (this refers to global/window)
}
}
Arguments Object
Arrow functions don't have their own arguments object:
function regular() {
console.log(arguments) // Arguments object
}
const arrow = () => {
console.log(arguments) // ReferenceError
}
Constructor
Arrow functions cannot be used as constructors:
const Regular = function() {}
new Regular() // OK
const Arrow = () => {}
new Arrow() // TypeError: Arrow is not a constructor
Higher-order functions
Functions that take other functions as arguments or return functions:
// Function as argument
function map(arr, fn) {
return arr.map(fn)
}
// Function as return value
function multiplier(factor) {
return function(x) {
return x * factor
}
}
const double = multiplier(2)
double(5) // 10
Closures
Functions that have access to variables in their outer scope:
function outer() {
const message = "Hello"
function inner() {
console.log(message) // Accesses outer variable
}
return inner
}
const innerFn = outer()
innerFn() // "Hello"
Immediately invoked function expression (iife)
Functions that are executed immediately:
(function() {
console.log("IIFE")
})()
// With arrow function
(() => {
console.log("IIFE")
})()
Generator functions
Functions that can be paused and resumed:
function* numbers() {
yield 1
yield 2
yield 3
}
const gen = numbers()
gen.next() // { value: 1, done: false }
gen.next() // { value: 2, done: false }
gen.next() // { value: 3, done: false }
gen.next() // { value: undefined, done: true }
Async functions
Functions that return Promises:
async function fetchData() {
const response = await fetch('/api/data')
return response.json()
}
Function properties
name
The name of the function:
function greet() {}
greet.name // "greet"
const anonymous = function() {}
anonymous.name // "anonymous"
length
The number of parameters:
function example(a, b, c) {}
example.length // 3
Best practices
-
Use arrow functions for callbacks: Cleaner syntax for
map(),filter(), etc. -
Use function declarations for hoisting: Function declarations are hoisted, expressions are not.
-
Be consistent with
this: Understand when to use arrow functions vs regular functions based onthisbinding needs. -
Use default parameters: Instead of checking for
undefinedinside the function. -
Use rest parameters: For functions that accept variable numbers of arguments.