1. Hàm ẩn danh trong JavaScript là gì?

Hàm ẩn danh trong Js là một hàm được định nghĩa mà không có tên. Hàm ẩn danh cũng tương tự như với các hàm bình thường trong JavaScript, tuy nhiên điểm khác biệt là nó không được đặt tên khi khai báo hàm.

Hàm này được sinh ra đúng vào thời điểm chạy của chương trình. Thông thường khi bạn khai báo một hàm thì trình biên dịch sẽ lưu lại trong bộ nhớ nên bạn có thể gọi ở trên hay dưới vị trí khai báo hàm đều được, nhưng với anonymous functions thì nó sẽ được sinh ra khi trình biên dịch xử lý tới vị trí của nó.

Anonymous functions được khai báo bằng cách sử dụng toán tử thay vì sử dụng cú pháp định nghĩa hàm thông thường. Ta có cú pháp cơ bản về khai báo hàm ẩn danh như sau:

var learn = function()
{
    alert('Học Javascript tại laptrinhtudau.com');
};
 
// Gọi hàm
learn();

2. Khai báo hàm ẩn danh trong JavaScript

Việc khai báo này cũng tương tự như ta khai báo hàm bình thường. Cũng bằng cách sử dụng từ khóa function nhưng thay vào đó là sẽ không có tên hàm phía sau.

function (tham số 1, tham số 2, …) {
    Câu lệnh 1 trong hàm;
    Câu lệnh 2 trong hàm;
    …
    return giá trị trả về;
}

Nếu trong hàm có nhiều tham số, chúng ta sẽ viết chúng cách nhau bởi dấu phẩy. Nếu không sử dụng tham số trong hàm, chúng ta có thể lược bỏ chúng.

Lưu ý

Sau khi khai báo một hàm ẩn danh trong Js, nếu chúng ta không sử dụng nó ngay như gán nó vào một biến hoặc là sử dụng nó trong một hàm khác, thì lỗi sẽ bị xảy ra.

Để tránh được lỗi này thì ta phải làm sao? Đơn giản là ta chỉ cần đặt hàm ẩn danh vào cặp dấu ngoặc là được.

(function (a, b) {
  const sum = a + b;
  return sum ;
})

3. Gọi hàm ẩn danh trong JavaScript

3.1. Gọi trực tiếp hàm ẩn danh

Chúng ta có thể gọi trực tiếp hàm ẩn danh bằng cách sử dụng mô hình IIFE (biểu thức hàm chạy luôn). Cú pháp sẽ là:

( function (tham số 1, tham số 2, …) {
    Câu lệnh 1 trong hàm;
    Câu lệnh 2 trong hàm;
    …


    return giá trị trả về;
} ) ( đối số 1, đối số 2, …)

Ví dụ:

(function (a, b) {
  const sum = a + b;
  document.write(sum) ;
})(1,2)

Chúng ta đơn giản viết các đối số trong cặp dấu ngoặc () và truyền trực tiếp vào hàm ngay khi khai báo nó. Cách viết trên sẽ tương tự với các công đoạn khai báo hàm ẩn danh, rồi sau đó gọi hàm như sau:

const sum = function (a, b) {
  const sum = a + b;
  document.write(sum) ;
}

sum(9,7);

3.2. Gán hàm ẩn danh vào biến

Ta có thể gán một hàm ẩn danh vào biến có tên. Sau đó mỗi lần sử dụng hàm ẩn danh này ta chỉ cần gọi tên biến ấy ra là được.

Ví dụ:

Khai báo một hàm ẩn danh dùng để tính tổng các số nhập vào, và gọi hàm ẩn danh đó như sau:

const findsum = function (a, b) {
  const sum = a + b;
  return sum ;
}

findsum(7, 37);

Với hàm ẩn danh không có giá trị trả về và tham số ta sẽ khai báo nó như sau:

let hi = function () {
  document.write("Hello Laptrinhtudau.com!");
}

hi();

4. Ứng dụng của hàm ẩn danh trong JavaScript

Tùy vào từng trường hợp mà hàm ẩn danh rất hữu ích, nếu bạn cần một function ngay tại một thời điểm thì nó rất hữu ích, hoặc bạn muốn thực hiện một callback function thì nó cũng rất hữu ích.

function caller(func)
{
    func();
}
 
caller(function(){
    alert('Hàm callback');
});

Ngoài ra Hàm ẩn danh trong Js được xử dụng rộng rãi trong cả các ứng dụng phổ biến như Facebook SDK hay Google Analystics chẳng hạn.

(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v2.4&appId=123456789";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

(Chưa cần hiểu những code này đâu các bạn nhé)

5. Sự khác biệt hàm ẩn danh trong JavaScript

Sự khác biệt đầu tiên mà ta thấy ở hàm ẩn danh là nó không có tên so với những hàm bình thường khác.

Ngoài ra, còn một điểm khác biệt căn bản nữa, đó là để tái sử dụng một hàm ẩn danh, chúng ta nhất thiết phải gán nó vào một biến, và gọi tên biến đó mỗi khi sử dụng. Nếu bạn không gán hàm ẩn danh vào biến, bạn sẽ không gọi được nó nhiều lần trong chương trình và phải viết lại toàn bộ biểu thức hàm mỗi khi cần dùng đến.