Phương thức bind() trong JavaScript

Ngày đăng: 23/02/2021   -    Cập nhật: 23/02/2021
Trong bài hướng dẫn tự học JS này, bạn sẽ tìm hiểu về phương thức bind() trong JavaScript và biết cách sử dụng bind() để mượn phương thức, mượn hàm một cách hiệu quả.


Phương thức bind() trong JavaScript
 


Phương thức bind() là gì?



Phương thức bind() trả về một hàm mới, khi được gọi, nó có giá trị this được đặt thành một giá trị cụ thể.


Sau đây minh họa cú pháp của phương thức bind():




// Cú pháp phương thức bind()
fn.bind(thisArg[, arg1[, arg2[, ...]]])
 


Trong cú pháp này, phương thức bind() trả về một bản sao của hàm fn với giá trị cụ thể this (thisArg) và các đối số (arg1, arg2,…).


  • Không giống như phương thức call() hay phương thức apply(), phương thức bind() không thực thi ngay hàm. Nó chỉ trả về một phiên bản mới của hàm mà nó được đặt thành đối số thisArg.


Sử dụng bind() để liên kết hàm (function binding)



Khi bạn truyền một phương thức, một đối tượng đến một hàm khác dưới dạng callback, thì this sẽ bị mất. Ví dụ:



let sinhVien = {
    ten: "Ngọc Anh",
    getTen: function() {
        console.log(this.ten);
    }
};

setTimeout(sinhVien.getTen1000);
 


Kết quả:



undefined
 


Như bạn có thể thấy rõ ràng là sinhVien.getTen trả về undefined mà không phải là Ngọc Anh như chúng ta mong đợi.


Trong trường hợp này, câu lệnh:




setTimeout(sinhVien.getTen1000);
 


được JavaScript Engine hiểu là:



let f = sinhVien.getTen;
setTimeout(f1000); // Mất sinhVien context
 


Hàm this bên trong hàm setTimeout() được đặt thành đối tượng toàn cục ở chế độ không nghiêm ngặt (non-strict mode) và undefined trong chế độ nghiêm ngặt (strict mode).


Để tránh trường hợp này, bạn có thể bọc lệnh gọi đến phương thức sinhVien.getTen trong một hàm ẩn danh (anonymous function), như sau:




setTimeout(function() {
    sinhVien.getTen();
}, 1000);
 


Cách này sẽ hoạt động đúng mong đợi vì nó lấy sinhVien từ phạm vi bên ngoài và sau đó gọi phương thức getTen().


Hoặc bạn có thể sử dụng phương thức bind() mà JS cung cấp:




// Sử dụng bind()
let f = sinhVien.getTen.bind(sinhVien);
setTimeout(f1000);
 


Chúng ta có thể hiểu thế này:


  • Dòng lệnh đầu tiên sẽ liên kết sinhVien.getTen đến đối tượng sinhVien sau đó gán vào f

  • Thứ hai, chuyển hàm ràng buộc f với giá trị this đã được đặt cho đối tượng sinhVien vào hàm setTimeout().


Sử dụng phương thức bind() để mượn phương thức từ đối tượng khác



Đầu tiên, giả sử bạn có một đối tượng vanDongVien, có phương thức chay:



let vanDongVien = {
    ten: "Ngọc Anh",
    chay: function(tocDo) {
        console.log(this.ten + ' chạy được ' + tocDo + ' m/s.');
    }
};
 


Và một đối tượng chim có phương thức bay:



let chim = {
    ten: "Chim chích",
    bay: function(tocDo) {
        console.log(this.ten + ' bay được ' + tocDo + ' m/s.');
    }
};
 


Bây giờ, nếu bạn muốn liên kết đối tượng chim với phương thức chay, bạn có thể sử dụng phương thức bind() để tạo phương thức chay với this được thiết lập thành đối tượng chim.



// Mượn phương thức chay()
// trong đối tượng vanDongVien
let chay = vanDongVien.chay.bind(chim0.5);
chay();
 


Trong câu lệnh trên:


  • Gọi phương thức bind() của phương thức vanDongVien.chay() và truyền vào đối tượng chim làm đối số đầu tiên và 0.5 là đối số thứ hai.

  • Gọi hàm chay().


Kết quả ta được:



Chim chích chạy được 0.5 m/s.
 


Như vậy, chúng ta đã mượn thành công phương thức chay() của đối tượng vanDongVien.


Khả năng mượn một phương thức của một đối tượng mà không cần tạo bản sao của phương thức đó và duy trì nó ở hai nơi riêng biệt là tính năng rất mạnh trong JavaScript.


Nắm được tính năng này sẽ giúp ích cho bạn rất nhiều khi học nâng cao lên front end Framework như React, Angular...


> Đăng ký ngay KHÓA HỌC FRONT END (với ReactJS) nếu bạn muốn đi chuyên sâu với ngôn ngữ JavaScript.



Tổng kết về bind() trong JS



Như vậy, trong bài hướng dẫn này, mình đã giúp bạn tìm hiểu về phương thức bind() trong JavaScript, biết được bind() là gì, sử dụng nó như thế nào...


Túm lại:



  • Phương thức bind() trả về một hàm mới, khi gọi, this sẽ được chỉ định cụ thể

  • Phương thức bind() cũng giúp mượn phương thức, mượn hàm (function borring) từ một đối tượng khác mà không cần nhân bản nó.


Bạn đã hiểu về phương thức bind() trong JS chưa? Hãy để lại bình luận nếu có chỗ nào chưa hiểu bạn nhé.


Chúc bạn học tốt!



---
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 thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0968051561
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 LẬP TRÌNH FRONT END VỚI REACT.JS

56 giờ
Học Lập trình Front end hiện đại với ReactJS. Học làm chủ HTML, CSS, JS và thư viện JavaScript phổ biến nhất hiện nay. Sẵn sàng đi thực tập / đi làm ngay sau khóa học.

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
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!