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

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


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


Giới thiệu phương thức call() trong JS



Trong JavaScript, một hàm là một thể hiện (đối tượng) của kiểu Function. Ví dụ:



// Khai báo một hàm
function ham() {
    //...
}

// Sử dụng instanceof để kiểm tra ham() có phải
// là một thể hiện của Function không?
console.log(ham instanceof Function); // true
 


Và trong kiểu Function thì có sẵn một phương thức được gọi là call() có cú pháp sau:



// Cú pháp call()
functionName.call(thisArgarg1arg2, ...);
 


Trong đó:


  • Phương thức call() gọi một hàm có tên là functionName với giá trị này và các đối số đã cho.

  • Đối số thisArg của phương thức call() là giá trị this. Nó cho phép bạn đặt giá trị this cho bất kỳ đối tượng nhất định nào.

  • Các đối số còn arg1, arg2... còn lại của phương thức cal() ​​là các đối số của hàm.


Khi bạn gọi một hàm, JavaScript Engine sẽ gọi phương thức call() của đối tượng hàm đó.


Giả sử rằng bạn có hàm thongBao() như sau:




// Khai báo hàm
function thongBao() {
    console.log("Hàm thông báo");
}
 


Và khi bạn gọi hàm thongBao() như sau:



// Gọi hàm
thongBao();
 


Nó tương đương với việc gọi phương thức call() trên đối tượng hàm thongBao:



thongBao.call();
 


Theo mặc định, giá trị this bên trong hàm được đặt thành đối tượng toàn cục, tức là window trên trình duyệt web và đối tượng toàn cục trên node.js:



// Khai báo hàm
function thongBao() {
    console.log(this);
}

// Gọi hàm
thongBao();
 


> Lưu ý rằng: Trong strict mode, this bên trong hàm được thiết lập thành undefined thay vì toàn cục.


Hãy xem xét ví dụ sau:



// Khai báo hàm
function tong2So(ab) {
    return a + b;
}


let ketQua = tong2So.call(this1020);
console.log(ketQua);
 


Kết quả ta được:



30
 


Trong ví dụ này, thay vì gọi trực tiếp hàm tong2So(), chúng ta sử dụng phương thức call() để gọi hàm tong2So(). Giá trị this lúc này được đặt thành đối tượng toàn cục.



let loiChao = "Chào";

let chaoHoi = {
    loiChao: "Xin chào"
}

function chao(ten) {
    console.log(this.loiChao + ' ' + ten);
}
 


Bên trong hàm chao(), chúng ta tham chiếu loiChao thông qua giá trị this.


Nếu bạn chỉ gọi hàm chao() thông qua phương thức call() như sau:




chao.call(this"JS");
 


Thì kết quả chúng ta nhận được là:



Chào JS
 


Tuy nhiên, khi chúng ta gọi phương thức call() của hàm chao() mà truyền đối tượng chaoHoi vào thay thế giá trị this như sau:



chao.call(chaoHoi"JS");
 


Thì kết quả chúng ta nhận được là:



Xin chào JS
 


Nghĩa là, trong trường hợp này, this.loiChao trong hàm chao() sẽ tham chiếu đến đối tượng chaoHoi, chứ không phải là đối tượng toàn cục.


Sử dụng phương thức call() trong JavaScript để nối hàm tạo cho một đối tượng



Phương thức call() có thể được sử dụng để nối các hàm tạo (constructor) cho một đối tượng.


Hãy xem ví dụ sau:




function Hinh(chieuCaochieuRong) {
    this.chieuCao = chieuCao;
    this.chieuRong = chieuRong;
}

function TuGiac(tongSoGocVuongchieuCaochieuRong) {
    Hinh.call(thischieuCaochieuRong);
    this.tongSoGocVuong = tongSoGocVuong;
}

let hinhVuong = new TuGiac(4100100);
 


Trong ví dụ này:


  • Đầu tiên, chúng ta tạo một hàm Hinh với 2 thuộc tính chieuCaochieuRong

  • Tiếp theo, trong hàm TuGiac, chúng ta gọi phương thức call() của Hinh để thiết lập chieuCaochieuRong cho hình tứ giác này.


khi đó, hàm TuGiac sẽ tương đương như thế này:



function TuGiac(tongSoGocVuongchieuCaochieuRong) {
    this.chieuCao = chieuCao;
    this.chieuRong = chieuRong;
    this.tongSoGocVuong = tongSoGocVuong;
}
 


Sử dụng phương thức call() để mượn hàm



Ví dụ, chúng ta có 2 đối tượng là otomayBay



const oto = {
    ten: "Vinfast VF33",
    khoiDong: function() {
        console.log("Khởi động " + this.ten);
    },
    tangToc: function() {
        console.log("Tăng tốc " + this.ten)
    },
    dungLai: function() {
        console.log("Dừng " + this.ten);
    }
};

const mayBay = {
    ten: "Su-34",
    bay: function() {
        console.log("Đang bay");
    }
};
 


Đoạn code sau sẽ mượn dùng phương thức khoiDong của đối tượng oto



oto.khoiDong.call(mayBay);
 


Kết quả là:



Khởi động Su-34
 


Hành vì này được gọi là mượn hàm (function borrwing)


Các ứng dụng điển hình của việc mượn hàm là sử dụng các phương thức có sẵn của Array.


Ví dụ: Đối tượng arguments bên trong một hàm là một đối tượng giống mảng, không phải là một đối tượng mảng. Để sử dụng phương thức slice() của đối tượng Array, bạn cần sử dụng phương thức call():




function laySoLe() {
    const danhSach = Array.prototype.slice.call(danhSachBanDau);
    return danhSach.filter(x => x % 2);
}

let soLe = laySoLe(1013489);
console.log(soLe);
 


Kết quả:



[1, 3, 9]
 


Trong ví dụ này, chúng ta đã chuyển bất kỳ danh sách số nào vào hàm laySoLe(). Từ đó lọc và về một mảng các số lẻ.


Câu lệnh sau đây sử dụng hàm call() để đặt this bên trong phương thức slice() thành đối tượng danhSachBanDau và thực thi phương thức slice():




const danhSach = Array.prototype.slice.call(danhSachBanDau);
 


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



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


Bạn sẽ gặp nó nhiều hơn khi chuyển sang HỌC FRONT END NÂNG CAO với các Framework như ReactJS.


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!