KHÔNG NÊN SỬ DỤNG ARROW FUNCTION?

Ngày đăng: 22/10/2020   -    Cập nhật: 31/10/2020
Arrow Function là một tính năng của ES6, Arrow Function đã trở nên phổ biến. Vậy thì tại sao lại không nên sử dụng Arrow Function?


KHÔNG NÊN SỬ DỤNG ARROW FUNCTION?
 

Khi nhắc đến Arrow Function.


  • Ai mà không yêu từ cái nhìn đầu tiên?
  • Ai mà không thích sự đơn giản của arrow function chứ? 


Cú pháp của arrow function giúp chúng ta khai báo các hàm quá dễ dàng, tiết kiệm thời gian và tăng cường sự rõ ràng trong nhiều tình huống, loại bỏ tất cả những thứ gây mất tập trung, không cần thiết.


Hãy lấy một ví dụ về khai báo hàm thông thường và cùng một hàm sử dụng arrow function.


Trước đây:




function chao() {
    return "Chào mừng bạn đến với Arrow Function!";
}
 


Với Arrow Function trong Phiên bản ES6 (Đọc thêm: Các tính năng của ES6):



const chao = () => "Chào mừng bạn đến với Arrow Function!";
 


Có rõ ràng không?


Hãy so sánh một ví dụ khác:




const f = list.map(function(item) { return item; })
 


Với...



const f = list.map((item=> item)
 


Code có đẹp không?


Có!


Vậy...



Có vấn đề gì ở Arrow Function?



Arrow Function rất tiện lợi.


Tuy nhiên, chúng ta cần phải cẩn thận, vì sự khác biệt giữa 2 khai báo không chỉ là ở cú pháp và do đó nó không nên sử dụng Arrow Function trong MỘT SỐ TRƯỜNG HỢP.


Bây giờ chúng ta hãy xem xét các tình huống mà bạn không nên sử dụng arrow function.


Hãy xem ví dụ sau:




const baiViet = {
    likes: 0,
    like: () => {
        this.likes++;
    }
}
 


Trong ví dụ này, bạn có thể nghĩ rằng mỗi khi chúng ta gọi baiViet.like() thì thuộc tính baiViet.likes sẽ tăng lên 1 (ban đầu là 0).


Tuy nhiên, không phải vậy, trong trường hợp này likes sẽ không tăng lên.


Nó vẫn như vậy và bài viết này sẽ không bao giờ được nhiều like.


Tại sao nhỉ?


Có vấn đề gì ở đây?


Vâng, vấn đề là ở this và phạm vi.


Như MDN đã nói:



"Một Arrow Function Expression là một thay thế nhỏ gọn về mặt cú pháp cho Biểu thức hàm thông thường, mặc dù không có ràng buộc riêng với các từ khóa this, arguments, super hoặc new.target. Arrow Function Expression không phù hợp để làm phương thức và constructor"

 
Nghĩa là trong trường hợp của chúng ta, phạm vi kèm theo sẽ là đối tượng window. Khi gọi phương thức like() đơn giản là chúng ta đang cố gắng tăng thuộc tính likes trên đối tượng window.


Trong trường hợp này, chúng ta sử dụng cú pháp truyền thống:




const baiViet = {
    likes: 0,
    like: function () {
        this.likes++;
    }
}
 


Một ví dụ thực tế chức năng like bài viết.




Tương tự như ví dụ trên, object prototypes sẽ đánh giá this là đối tượng window, giống như trong ví dụ sau:



class BaiViet {
    constructor(tieuDe) {
        this.tieuDe = tieuDe;
        this.chiaSe = false;
    }
};

BaiViet.prototype.chiaSe = () => {
    return this.chiaSe = true;
};
 


Tương tự, giống trường hợp trước, phương thức chiaSe() sẽ không hoạt động do phạm vi kèm theo đối tượng window.


Và một lần nữa, giải pháp là làm theo cách thông thường:



BaiViet.prototype.chiaSe2 = function() {
    return this.chiaSe = true;
};
 


Ví dụ thực tế:





Trong ví dụ tiếp theo, chúng ta sẽ xem xét ngữ cảnh động trong các lệnh callback, như trong các sự kiện:



var btn = document.getElementById('btn1');

btn.addEventListener('click', () => {
    this.classList.toggle('doiMau');
});
 


Một lần nữa nó lại tương đồng với các ví dụ trước, bạn có thể đoán vấn đề là gì không?


Vâng, giống như trước khi phạm vi kèm theo đang ảnh hưởng đến ý nghĩa của this.


Ví dụ thực tế:





Ở tình huống này, bạn vẫn có thể sử dụng arrow function và sử dụng đối tượng sự kiện để truy cập đối tượng trong hàm đó.


Mặc dù nó không giải quyết được vấn đề phạm vi, nhưng nó hoạt động cho ví dụ cụ thể này:




var btn = document.getElementById('btn1');

btn.addEventListener('click', (e=> {
    e.target.classList.toggle('doiMau');
});
 


Bạn thấy không, đôi khi việc sử dụng arrow function sẽ làm cho code không thể đọc được.


Ý tưởng đằng sau arrow function là làm cho code của chúng ta rõ ràng hơn, vì vậy hãy đảm bảo rằng nó vẫn luôn như vậy.



Tóm lại là không nên sử dụng Arrow Function trong một số trường hợp.



Phiên bản ES6 đã giới thiệu nhiều ý tưởng tuyệt vời, và arrow function là một trong số đó.


Hi vọng qua bài viết này bạn biết khi nào không nên sử dụng Arrow Function hoặc nếu code bạn gặp vấn đề, bạn biết một trong số các lý do rồi đấy.


Chúc bạn học lập trình tốt hơn.


> Nếu bạn đang tích cực học lập trình mà vẫn chưa đạt hiệu quả gì thực tế. Hãy cân nhắc tham gia KHÓA HỌC LẬP TRÌNH (Full Stack) với lộ trình bài bản. Được truyền đạt Kiến thức - Kinh nghiệm thực tế từ chính các chuyên gia đến từ doanh nghiệp tuyển dụng.


---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Bình luận Facebook
Khóa học liên quan đến bài viết

Khóa học PHP Full stack [2023] cho người mới bắt đầu

96 giờ
Khóa học Lập trình PHP Full stack, phiên bản cập nhật lần thứ 8. Dạy Lập trình PHP bài bản từ Front end đến Back end + Laravel. Hướng dẫn làm 2 Dự Án Web lớn

KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG

50 giờ
Khóa học giúp học viên sử dụng thành thạo ngôn ngữ Lập trình Python (3x). Hiểu và phát triển được Ứng dụng Web với Django Framework. Học thực hành với Giảng viên cao cấp.

Lập trình PHP với Laravel Framework

42 giờ
Khóa học Lập trình PHP với Laravel Framework được NIIT - ICT HÀ NỘI xây dựng nhằm hoàn thiện kỹ năng lập trình web các các bạn đã biết Lập trình Web PHP thuần.

Khóa học Java Full stack (IJFD)

104 giờ
Học lập trình Java Fullstack với khóa học được xây dựng theo lộ trình bài bản, từ JAVA CƠ BẢN đến JAVA WEB và nâng cao về JAVA FRAMEWORK như: Spring Boot, Hibernate

KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)

48 giờ
Khóa học Angular & TypeScript (Front end) sẽ giúp bạn làm chủ được nền tảng Angular từ đó phát triển được các ứng dụng mạnh mẽ, đa nền tảng.
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!