Types of Function

Một hàm trong JS có thể có nhiều cách khai báo:

  • Declaration function
  • Expression function
  • Anonymous function
  • Arrow function

Important

JavaScript không hỗ trợ function overloading một cách tường minh.

Declaration Function

Đây là cách khai báo đơn giản, tương tự C++.

  • Hành động lấy giá trị của hàm gọi là call hoặc invoke.
  • Trả về giá trị trong hàm của JavaScript cũng dùng từ khóa return như C/C++.
  • Nếu hàm không trả về giá trị gì thì giá trị của nó là undefined.

Ví dụ:

function square(n) {
  return n * n
}
 
let squareOfEleven = square(11)
 
console.log(squareOfEleven) // 121

Summary

Điểm mạnh:

  • Có global scope.
  • Có thể gọi thực thi hàm trước khai báo hàm (do có Hoisting).

Expression Function

Expression function (hàm biểu thức) là hàm mà được gán cho một biến như một biểu thức.

const factorial = function calcFactorial(n) {
  return n < 2 ? 1 : n * calcFactorial(n - 1)
}
 
console.log(factorial(3)) // 6

Ta có:

  • Biến factorial mang giá trị là một hàm, có thể dùng toán tử gọi hàm ().
  • Tên hàm calcFactorial được dùng để gọi đệ quy bên trong hàm, có thể bỏ đi nếu không dùng đệ quy.

Summary

Điểm mạnh

  • Tiện lợi khi không có nhu cầu tái sử dụng. Có thể dùng như là đối số của hàm khác (Callback).

Điểm yếu

  • Không thể thực thi hàm trước khai báo hàm (không có Hoisting).

Anonymous Function

Anonymous function (hàm vô danh) có bản chất là expression function nhưng không có tên.

const square = function (n) {
  return n * n
}
 
console.log(square(11)) // 121

Important

Chỉ expression function mới được phép không có tên (declaration thì bắt buộc phải có).

Function with Default Parameters

Đôi khi ta muốn hàm có một tham số mặc định nào đó. Nếu chúng ta không truyền vào đối số thì hàm sẽ lấy giá trị đó để xử lý.

Hàm với tham số mặc định có thể khai báo dưới dạng declaration function hoặc arrow function.

Với declaration function:

function moodOfDay(mood = "happy") {
  let str = `Today's mood is ${mood}`
  return str
}
 
console.log(moodOfDay()) // Today's mood is happy
console.log(moodOfDay("sad")) // Today's mood is sad

Với arrow function:

const moodOfDay = (mood = "happy") => {
  let str = `Today's mood is ${mood}`
  return str
}
 
console.log(moodOfDay()) // Today's mood is happy
console.log(moodOfDay("sad")) // Today's mood is sad

Unlimited Number of Parameters

Hàm có thể không có số lượng tham số cố định. Để xây dựng những hàm này, ta có hai cách là sử dụng declaration function hoặc arrow function.

Info

Tất cả các đối số truyền vào declaration function đều sẽ được truy cập thông qua đối tượng arguments ở bên trong hàm.

Ví dụ với declaration function:

function sumAllNums() {
  let sum = 0
 
  for (const argument of arguments) {
    sum += argument
  }
 
  return sum
}
 
console.log(sumAllNums(1, 2, 3, 4)) // 10
console.log(sumAllNums(10, 20, 13, 40, 10)) // 93
console.log(sumAllNums(15, 20, 30, 25, 10, 33, 40)) // 173

Đối với arrow function thì ta cần dùng rest operator để gom các đối số lại thành một mảng các giá trị:

const sumAllNums = (...args) => {
  return args.reduce((acc, curr) => acc + curr, 0)
}
 
console.log(sumAllNums(1, 2, 3, 4)) // 10
console.log(sumAllNums(10, 20, 13, 40, 10)) // 93