Thuật ngữ cho một hàm JavaScript ẩn danh được gọi ngay lập tức là gì?


29

Tôi đang viết hướng dẫn kiểu JavaScript cho nhóm của mình để chúng tôi có thể sắp xếp và đóng góp tài liệu của mình dễ dàng hơn. Nhưng tôi đã gặp một vết sưng nhỏ, đó là nơi câu hỏi của tôi được áp dụng ...

Tôi phải gọi một hàm JavaScript ẩn danh được gọi là gì ngay lập tức. Tôi biết tôi hoàn toàn có thể gọi nó là "hàm ẩn danh", nhưng tôi muốn nhấn mạnh sự thật rằng nó được gọi ngay lập tức.

Đây là một ví dụ:

var MyVariable = (function(data){
  return "another value"
})("some value"); 

console.log(MyVariable);
// "another value"

1
Lưu ý bạn sẽ thường thấy cấu trúc này (không chính xác) được gọi là "chức năng tự gọi"
AakashM

Câu trả lời:


39

Họ đã có một thuật ngữ cho điều đó trong thế giới Javascript. Chúng được gọi là Biểu thức hàm được gọi ngay lập tức (IIFE) .

Nó là gì

Các chức năng IIFE không được đặt tên. Thay vào đó, chúng được thực thi một lần khi trình thông dịch đi qua chúng:

var area = function() {
    var width = 3;
    var height = 2;
    return width * height;
}();

Các dấu ngoặc đơn cuối cùng sau dấu ngoặc nhọn đóng của khối mã báo cho trình thông dịch gọi biểu thức hàm ngay lập tức.

Nếu bạn viết một khai báo hàm, bạn phải thêm các toán tử nhóm hoặc dấu ngoặc đơn xung quanh hàm, để báo cho trình thông dịch xử lý hàm như một biểu thức có thể được gọi ngay lập tức:

var area;
(function() {
    var width = 3;
    var height = 2;
    area = width * height;
}());


Khi chúng được sử dụng

IIFE được sử dụng cho mã chỉ cần chạy một lần trong một tác vụ, thay vì được gọi nhiều lần.

  1. Là một đối số khi một hàm được gọi (để tính giá trị, v.v.)
  2. Để gán giá trị của một tài sản cho một đối tượng.
  3. Trong xử lý sự kiện và người nghe.
  4. Để ngăn xung đột giữa hai tập lệnh có thể sử dụng cùng tên biến. Chúng có thể được sử dụng làm trình bao bọc để thả mã trong một tập lệnh khác mà bạn không chắc chắn nếu tên biến có thể giống nhau hay không.

Một nitpick: Trong ví dụ của bạn sử dụng var area = ..., bạn không cần dấu ngoặc đơn "gói" trên hàm, bởi vì nó đã là biểu thức hàm nhờ vào phía bên phải của =. Các dấu ngoặc đơn chỉ cần thiết khi hàm được viết dưới dạng khai báo hàm (nghĩa là không có phần đầu var area = ...).
Eric King

@EricKing tôi đã làm đúng chưa?
Lawrence Aiello

Thật tuyệt khi có thể gọi một cách tình cờ hơn những 'chức năng thể hiện' này
bộ lọc

@LawrenceAiello Tôi đã thêm một chỉnh sửa để hiển thị những gì tôi muốn nói. Hy vọng nó vẫn làm việc cho bạn.
Eric King

Là một câu hỏi liên quan, có lý do nào để chuyển một đối số cho IIFE như câu hỏi cho thấy không? Tôi chỉ từng thấy những điều này giống như cách bạn thể hiện - không có bất kỳ đối số nào (vì bất kỳ đối số nào cũng có thể là biến cục bộ).
Kat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.