Arrow Function JavaScript có gì hay?

Arrow Function JavaScript là một trong những tính năng được giới thiệu trong phiên bản JavaScript ES6. Nó cho phép chúng ta tạo các functions một cách gọn gàng hơn so với các function thông thường. Cùng tìm hiểu về nó thông qua bài viết này nhé!

JavaScript Arrow Function

Để hiểu hơn về JavaScript Arrow Function mình sẽ tạo một ví dụ như sau:

 

let

x

=

function

(

x

,

y

)

{

return

x

*

y

;

}

Ở trên là một function expression chúng ta thường tạo. Nó có thể được viết lại như sau:

 

let

x

=

(

x

,

y

)

=>

x

*

y

;

Các bạn thấy khi sử dụng arrow function thì code của chúng ta trở nên rất ngắn gọn đúng không 😁. Bây giờ chúng ta cùng tìm hiểu về cú pháp của arrow function nhé.

Arrow Function Syntax

Cú pháp của Arrow Function như sau:

let

myFunction

=

(

arg1

,

arg2

,

...

argN

)

=>

{

}

Trong đó:

  1. myFunction là tên của hàm
  2. arg1, arg2, … argN là các đối số của hàm

Nếu thân hàm chỉ có một câu lệnh hoặc biểu thức, chúng ta có thể viết gọn lại như sau:

 

let

myFunction

=

(

arg1

,

arg2

,

...

argN

)

=>

expression

Ví dụ Arrow Function

Nếu hàm không nhận bất kỳ đối số nào, thì chúng ta sử dụng dấu ngoặc đơn () trống.

let

greet

=

(

)

=>

console

.

log

(

'Đây là blog homiedev.com'

)

;

greet

(

)

;

Với hàm có 1 đối số thì chúng ta có thể viết gọn như sau:

let

greet

=

x

=>

console

.

log

(

x

)

;

greet

(

'Xin chào! đây là blog homiedev.com'

)

;

Như các bạn thấy chúng ta có thể bỏ qua ngoặc đơn như ở trên khi hàm có 1 đối số.

Chúng ta có thể sử dụng Arrow Function trong một biểu thức:

let

age

=

22

;

let

welcome

=

(

age

<

18

)

?

(

)

=>

console

.

log

(

'Baby'

)

:

(

)

=>

console

.

log

(

'Adult'

)

;

welcome

(

)

;

Nếu thân hàm có nhiều câu lệnh, chúng ta cần đặt chúng bên trong dấu ngoặc nhọn {}:

let

sum

=

(

a

,

b

)

=>

{

let

result

=

a

+

b

;

return

result

;

}

let

result

=

sum

(

5

,

5

)

;

console

.

log

(

result

)

;

Bên trong một hàm thông thường, từ khóa this sẽ thay đổi theo cách mà hàm đó được gọi:

  1. Gọi hàm kiểu thông thường: this sẽ là global object hoặc có thể undefined nếu bạn đang sử dụng strict mode.
  2. Gọi kiểu method: this sẽ tương đương với object sở hữu method đó.
  3. Gọi kiểu Constructor: this sẽ tương đương với đối tượng mới được tạo ra.

Tuy nhiên, điều này lại không giống ở Arrow Function. Bất cứ khi nào chúng ta sử dụng this trong Arrow Function, nó đề cập đến phạm vi bên ngoài, chứa nó (parent scope). Giá trị this bên trong của một Arrow Function luôn bằng với giá trị this của hàm chứa nó.

Đối với hàm thông thường:

function

Person

(

)

{

this

.

name

=

'Trinh'

,

this

.

age

=

22

,

this

.

sayMyName

=

function

(

)

{

console

.

log

(

this

.

age

)

;

function

innerFunc

(

)

{

console

.

log

(

this

.

age

)

;

console

.

log

(

this

)

;

}

innerFunc

(

)

;

}

}

let

x

=

new

Person

(

)

;

x

.

sayName

(

)

;

Ở ví dụ trên, this.age bên trong this.sayMyName() có thể truy xuất được vì this.sayMyName() là method của một object.

Tuy nhiên, innerFunc() là một hàm thông thường cho nên this.age sẽ không thể truy xuất được vì lúc này this là đối tượng toàn cục (Window object). Do đó, this.age bên trong hàm innerFunc() cho giá trị undefined.

Kết quả của ví dụ trên sẽ là:

22

undefined

Window

{

}

Đối với Arrow Function sẽ có một chút khác biệt như sau:

function

Person

(

)

{

this

.

name

=

'Trinh'

,

this

.

age

=

22

,

this

.

sayMyName

=

function

(

)

{

console

.

log

(

this

.

name

)

;

let

innerFunc

=

(

)

=>

{

console

.

log

(

this

.

name

)

;

}

innerFunc

(

)

;

}

}

const

x

=

new

Person

(

)

;

x

.

sayMyName

(

)

;

Kết quả sẽ là:

Trinh
Trinh

Ở ví dụ trên, hàm innerFunc() được định nghĩa bằng cách sử dụng Arrow Function. Và bên trong hàm, this sẽ trỏ đến scope bên ngoài chứa nó. Do đó, this.name cho kết quả như trên.

Bạn có thể đọc thêm các bài viết liên quan đến scope nhé:

Arguments Binding

Các hàm thông thường có các Arguments Binding (đối số ràng buộc). Đây chính là lý do tại sao khi chúng ta truyền các đối số cho một hàm thông thường, thì ta có thể truy cập chúng bằng cách sử dụng từ khóa arguments.

Ví dụ:

let

x

=

function

(

)

{

console

.

log

(

arguments

)

;

}

x

(

1

,

2

,

3

)

;

Ngược lại, với Arrow Function sẽ không có Arguments Binding.

Khi chúng ta thử sử dụng từ khóa arguments, nó sẽ báo lỗi.

Ví dụ:

let

x

=

(

)

=>

{

console

.

log

(

arguments

)

;

}

x

(

1

,

2

,

3

)

;

Khi sử dụng Arrow Function, bạn muốn lấy các đối số đã truyền dưới dạng một mảng thì chúng ta sẽ sử dụng spread syntax như sau:

let

x

=

(

...

n

)

=>

{

console

.

log

(

n

)

;

}

x

(

1

,

2

,

3

)

;

Bài viết liên quan đến spread syntax các bạn có thể tham khảo tại:

Promises và Callbacks sử dụng Arrow Function

Chúng ta có thể viết các Promises và Callbacks trong JavaScript sử dụng Arrow Function vì cú pháp của nó ngắn gọn hơn.

Ví dụ:

 

asyncFunction

(

)

.

then

(

function

(

)

{

return

asyncFunction1

(

)

;

}

)

.

then

(

function

(

)

{

return

asyncFunction2

(

)

;

}

)

.

then

(

function

(

)

{

finish

;

}

)

;

Ví dụ trên chúng ta có thể viết như sau:

 

asyncFunction

(

)

.

then

(

(

)

=>

asyncFunction1

(

)

)

.

then

(

(

)

=>

asyncFunction2

(

)

)

.

then

(

(

)

=>

finish

)

;

Các bạn có thể thấy code đã gọn lại hơn nhiều rồi đúng không ^^.

Trường hợp tránh sử dụng Arrow Functions

Trong trường hợp dưới đây chúng ta nên tránh sử dụng Arrow Function nhé ^^.

  1. Không nên sử dụng Arrow Functions để tạo các method bên trong các objects.

let

person

=

{

name

:

'Minh'

,

age

:

22

,

sayName

:

(

)

=>

{

console

.

log

(

this

.

age

)

;

}

}

person

.

sayName

(

)

;

  1. Chúng ta không thể sử dụng Arrow Functions làm constructor

let

Person

=

(

)

=>

{

}

;

let

person1

=

new

Person

(

)

;

Như vậy là chúng ta đã tìm hiểu xong Arrow Function trong JavaScript. Hi vọng bài viết có ích cho các bạn.

Nếu có thắc mắc hay góp ý chúng ta cùng nhau thảo luận dưới phần bình luận của bài viết nhé 😁. Chúc các bạn học tốt