Chào mừng bạn đến với Vimentor!

Hỏi đáp
Đăng ký

3. Trả về hàm

bài trước, chúng ta đã thực hiện khai báo một biểu thức hàm, nghĩa là gán một hàm vào một biến, và sau đó gọi biến đó với cặp ngoặc () đi sau. Một biểu thức hàm, về cơ bản, là một biểu thức. Và ta có thể dễ dàng trả về một hàm từ một hàm, thông qua việc sử dụng biểu thức hàm. Ta hãy xem qua bài toán sau:

Trước hết, ta khai báo một mảng Nhân viên, chứa các mảng con gồm hai thành phần là tên và tuổi nhân viên.

var nhanvien = [["Le Tuong An", 30], ["Nguyen Nhat Minh", 20], ["Truong Minh Anh", 15], ["Tran Bao Ngoc", 35]]

Ta sẽ viết một hàm tìm và alert ra nhân viên lớn tuổi nhất.

Ta sẽ khai báo hàm như sau:

function nhanvienlontuoinhat(danhsach) {
……………………………

}

Đoạn mã thực thi của chúng ta bên trong sẽ có nhiệm vụ duyệt qua các mảng con, tìm ra nhân viên lớn tuổi nhất, và thực hiện alert ra tên và tuổi nhân viên ấy. Và dĩ nhiên, việc alert phải được thực hiện thông qua việc trả về một hàm.

Đoạn mã thực thi như sau:

function nhanvienlontuoinhat(danhsach) {
          var max = danhsach[0][1];
          var save = 0;
          for (var i = 1; i < danhsach.length; i++) {
                   if (max < danhsach[i][1]) {
                             max = danhsach[i][1];
                             save = i;
                   }
          }
          return function() {
                   alert("Nhan vien "+danhsach[save][0]+", "+danhsach[save][1]+" tuoi la nhan vien lon tuoi nhat");
          }
}

Ý tưởng của đoạn mã này như sau:

  1. Ta gán max bằng giá trị tuổi của phần tử đầu tiên.
  2. Ta lưu vị trí của phần tử đầu tiên vào biến save (save = 0).
  3. Ta sẽ duyệt qua toàn bộ mảng nhân viên từ vị trí thứ hai. Nếu biến max nhỏ hơn giá trị tuổi của nhân viên thứ i, thì:
    1. Ta lưu lại giá trị của biến max là tuổi của nhân viên thứ i.
    2. Ta lưu lại vị trí của nhân viên thứ i vào biến save.
  4. Ta trả về hàm để alert ra Nhân viên có tên X và tuổi Y là nhân viên lớn tuổi nhất.

Cách gọi chạy hàm trên như sau:

var lonnhat = nhanvienlontuoinhat(nhanvien);
lonnhat();

Xin nhắc lại rằng ở đây ta áp dụng khai báo biểu thức hàm. Ta gán một biến lonnhat bằng hàm nhanvienlontuoinhat, với tham số truyền vào là mảng nhân viên. Vì hàm nhanvienlontuoinhat sẽ trả về một hàm, và đổ ngược lại vào biến lớn nhất, do đó để thực thi, ta phải gọi hàm lonnhat đi kèm cặp ngoặc đơn ().

Một câu hỏi thông minh được đặt ra ở đây là thế điều gì xảy ra nếu ta gọi biến lonnhat mà không có cặp ngoặc (). Đơn giản ta sẽ có như sau:

 

lonnhat;

=> function() {

           alert("Nhan vien "+danhsach[i][0]+", "+danhsach[i][1]+" tuoi la nhan vien lon tuoi nhat");

}

Ta có thể suy luận tương tự như sau, nếu ta gọi hàm nhanvienlontuoinhat với thông số truyền vào là nhân viên, ta sẽ được kết quả tương tự:

nhanvienlontuoinhat(nhanvien);

=> function() {

              alert(“Nhan vien “+danhsach[i][0]+”, “+danhsach[i][1]+” tuoi la nhan vien lon tuoi nhat”);

}

Ở đây ta có thể thấy được sự linh hoạt của ngôn ngữ Javascript. Để có được kết quả như mong đợi, là hiện ra cửa sổ popup thông báo nhân viên tên X có tuổi Y là nhân viên lớn tuổi nhất, ta sẽ khai báo như sau:

nhanvienlontuoinhat(nhanvien) ();

 

Kết luận:

Về căn bản, một biểu thức hàm cũng là một biểu thức, và ta có thể dễ dàng trả về một hàm trong khai báo của một hàm. Ta cũng có thể gọi thực thi trực tiếp một khai báo hàm bằng cách thêm một cặp ngoặc () vào sau đó. Ở bài kế tiếp, chúng ta sẽ cùng tìm hiểu về Closure.

Luyện tập cho bài học này

Khóa học liên quan

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải