- vừa được xem lúc

Tìm hiểu bind() trong JavaScript

0 0 1

Người đăng: Vinh Phạm

Theo Viblo Asia

Trong JavaScript, hàm là các đối tượng hạng nhất (first-class objects). Điều này có nghĩa là chúng có thể được lưu trong biến, truyền như đối số và có các phương thức riêng. Một trong những phương thức đó là bind(), đóng vai trò quan trọng trong việc quản lý ngữ cảnh (context) của hàm. Hiểu cách hoạt động của bind() là điều cần thiết để viết mã JavaScript rõ ràng, dễ dự đoán và dễ bảo trì, đặc biệt trong lập trình hướng đối tượng và lập trình hướng sự kiện.

bind() là gì?

Phương thức bind() tạo ra một hàm mới mà khi được gọi, từ khóa this bên trong hàm đó sẽ được gán với giá trị đã cung cấp. Nó cũng cho phép truyền trước các đối số tùy chọn – còn được gọi là áp dụng một phần (partial application).

Cú pháp

function.bind(thisArg[, arg1[, arg2[, ...]]])

Trong đó:

  • thisArg: Giá trị mà this sẽ tham chiếu tới khi hàm được gọi.
  • arg1, arg2, ...: Các đối số tùy chọn được truyền trước cho hàm mới.

Tại sao bind() lại hữu ích?

Từ khóa this trong JavaScript hoạt động khác với nhiều ngôn ngữ khác. Nó được xác định bởi cách hàm được gọi, không phải bởi nơi hàm được định nghĩa. Điều này có thể dẫn đến những hành vi không mong muốn, đặc biệt trong các đoạn mã bất đồng bộ (asynchronous), trình xử lý sự kiện (event handlers), và callback.

Một số trường hợp sử dụng phổ biến

1. Giữ nguyên ngữ cảnh trong trình xử lý sự kiện

function Handler() { this.message = "Event triggered";
} Handler.prototype.handleClick = function () { console.log(this.message);
}; const handler = new Handler();
document.getElementById("btn").addEventListener("click", handler.handleClick.bind(handler));

Nếu không dùng bind(), this sẽ tham chiếu đến phần tử DOM kích hoạt sự kiện, chứ không phải thể hiện Handler.

2. Áp dụng một phần (Partial Application)

Bạn có thể dùng bind() để tạo một hàm với các đối số được truyền trước.

function multiply(a, b) { return a * b;
} const double = multiply.bind(null, 2);
console.log(double(5)); // Output: 10

3. Sử dụng với setTimeout hoặc setInterval

function Greeter(name) { this.name = name;
} Greeter.prototype.greet = function () { console.log("Hello, " + this.name);
}; const greeter = new Greeter("Alice"); setTimeout(greeter.greet.bind(greeter), 1000);

Nếu bạn không bind() hàm greet(), this có thể là undefined hoặc tham chiếu tới đối tượng toàn cục (global object).

Sự khác biệt giữa call(), apply()bind()

  • call(): Gọi hàm ngay lập tức với this và các đối số được chỉ định.
  • apply(): Giống như call(), nhưng các đối số được truyền dưới dạng mảng.
  • bind(): Trả về một hàm mới với this và các đối số được ràng buộc, nhưng không gọi ngay lập tức.

Ví dụ:

function sayHello(greeting) { console.log(`${greeting}, ${this.name}`);
} const person = { name: "John" }; sayHello.call(person, "Hi"); // Output: Hi, John
sayHello.apply(person, ["Hello"]); // Output: Hello, John
const boundFunc = sayHello.bind(person, "Hey");
boundFunc(); // Output: Hey, John

Một số đặc điểm quan trọng

  • bind() không thay đổi hàm gốc.
  • Hàm được trả về từ bind() có thể được tái sử dụng hoặc lưu trữ.
  • Hoạt động mượt mà với các mẫu hướng đối tượng và class trong ES6 trở lên.

Kết luận

Phương thức bind() là một tính năng mạnh mẽ trong JavaScript, giúp quản lý ngữ cảnh this một cách đáng tin cậy. Nó đặc biệt hữu ích trong lập trình bất đồng bộ, xử lý sự kiện và các mẫu lập trình hàm. Làm chủ bind() giúp lập trình viên kiểm soát tốt hơn việc thực thi hàm, dẫn đến mã nguồn ổn định và dễ bảo trì hơn.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 553

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 467

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 172

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 161

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 122

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 265