Published on
-
3 mins read

Function Declaration vs Function Expression in Javascript

Authors
  • avatar
    Name
    Tuan Anh Huynh (Leo)
    Twitter
    @hta218
Take note

Post này chỉ là 1 note nhỏ của mình cho những dev hay quên về 2 khái niệm Function DeclarationFunction Expression để mỗi lần nhắc đến chỉ việc vào đây xem lại chứ không cần phải google nữa

Chắc hẳn anh em ngày ngày làm việc với Javascript sẽ viết rất nhiều function với các cú pháp như:

function doSomething() {} // function declaration
// hoặc
const doSomething = function () {} // function expression
// hoặc
const doSomething = () => {} // function expression

Cách viết đầu tiên chính là Function Declaration, và 2 cách sau là Function Expression, vậy chúng khác gì nhau và sử dụng như thế nào?

Definition

Khác biết đầu tiên chính là cách định nghĩa function

  • Function Declaraion được khai báo với từ khóa functionluôn bao gồm tên của function đó
function doSomething() {}
  • Function Expression được khai báo tương tự như Function Declaraion nhưng được gán vào 1 biến và sẽ chạy khi được gọi qua biến đó, tên của function có thể bỏ đi (Anonymous Function)
const doSomething = function () {}
// Anonymous function in ES6 syntax
const doSomething = () => {}

Hoisting

Hoisting là 1 cơ chế của Javascript thể hiện việc đưa functionvariable lên trên cùng của scope trước khi code được thực thi.

Hoisting chỉ áp dụng Function Declarations, không áp dụng cho Function Expressions

Có thế hiểu đơn giản qua ví dụ sau:

sayHello() // => "Hello"
function sayHello() {
console.log('Hello')
}

Bạn có thể call Function Declaration ở bất cứ đâu trong scope nó khởi tạo

Tuy nhiên Function Expression chỉ có thể gọi sau khi định nghĩa

sayHello() // => Uncaught ReferenceError: Cannot access 'sayHello' before initialization
const sayHello = function () {
console.log('Hello')
}

Tùy theo thói quen của devrule của project hoặc team leader đặt ra mà có thể sử dụng 1 trong 2 cách define function này.

Tuy nhiên có 1 số trường hợp đặc biệt để sử dụng Function Expression

IIFE

Immediately Invoked Function Expressions hay 1 Anonymous Function được chạy ngay sau khi khởi tạo

;(function () {
console.log('Code runs!')
})()
// ES6
;(() => {
console.log('Code runs!')
})()

Callback

1 trường hợp sử dụng Function Expression nữa đó là dùng làm callback

buttonElement.addEventListener('click', function (e) {
console.log('button is clicked!')
})

hoặc

array.map((item) => {
// do stuff to an item
})

Đây là trường hợp phổ biến sử dụng Function Expression vì chúng ta không cần biết đến function này trong toàn bộ scope

Tóm lại, có thể sử dụng linh hoạt 2 cách define function trên, nếu muốn 1 function có thể sử dụng linh hoạt nhiều nơi trong scope thì sử dụng Function Declaration còn nếu chỉ cần giới hạn trong 1 thời điểm sử dụng thì dùng Function Expression

Refs