2013-08-09 33 views
14
var ninja = (function(){ 
    function Ninja(){}; 
    return new Ninja(); 
})(); 

Tại sao hàm trên được đóng gói trong dấu ngoặc đơn và tại sao có một (); ở cuối?Giải thích câu lệnh JavaScript sau?

Tôi nghĩ rằng đó là hàm xây dựng vì số (); ở cuối, nhưng tại sao đối tượng được bao trong dấu ngoặc đơn?

+0

Tôi khuyên bạn nên đọc, http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+1

Xem thêm: [Làm thế nào để ẩn danh chức năng trong JavaScript làm việc?] (http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work) –

+0

@KevinDeVoe bản sao của bạn tốt hơn – Dave

Trả lời

7

mã này tương đương với:

function Ninja() { 
    // nothing here 
} 

var ninja = new Ninja(); 

Mặc dù trong mã bạn đã liệt kê, hàm/đối tượng Ninja không phải là phạm vi toàn cục.

(function() {...})(); về cơ bản nói "lấy bất kỳ chức năng nào được chứa bên trong đây và thực hiện ngay lập tức". Vì vậy, nó tạo ra một chức năng vô danh và gọi nó ngay sau đó.

4

Được gọi là Immediately-Invoked Function Expression (hoặc IIFE). Nó tạo ra một phạm vi mới và thực hiện các nội dung ngay lập tức. Có rất nhiều công dụng cho nó; cái mà tôi sử dụng nhiều nhất là khi từ khóa this sẽ thay đổi ý nghĩa, ví dụ: trong

var someClass = function() { 
    this.property = something; 
    this.update = (function(obj) { 
     function() { 
      $('.el').each(function() { 
       $(this).html(obj.property); 
      }); 
     }; 
    )(this); 
}; 

Trong khi tôi muốn đề cập đến this.property bên trong $('.el').each(), this thay đổi có nghĩa là trong phạm vi đó và đề cập đến các phần tử DOM hiện tại đang được looped qua với .each(). Vì vậy, bằng cách chuyển this làm tham số vào IIFE (và gọi tham số đó obj), tôi có thể sử dụng obj.property để tham chiếu đến số this.property khi nằm ngoài phạm vi $('.el').each(..., function() { ... });.

Hãy cho tôi biết nếu có ý nghĩa hoặc nếu bạn có bất cứ thắc mắc :)

0

Theo đề nghị: đề cập đến Benalman

Ngay-Được triệu gọi hàm Expression (IIFE) May mắn thay, Lỗi Cú pháp “sửa chữa” là đơn giản. Cách được chấp nhận rộng rãi nhất để báo cho trình phân tích cú pháp mong đợi một biểu thức hàm chỉ để bao bọc trong các lần parens, bởi vì trong JavaScript, các parens không thể chứa các câu lệnh. Tại thời điểm này, khi trình phân tích cú pháp gặp từ khóa hàm, nó biết phân tích nó như là một biểu thức hàm và không phải là một khai báo hàm.

// Có thể sử dụng một trong hai mẫu sau đây để gọi ngay // biểu thức hàm, sử dụng ngữ cảnh thực thi của hàm thành // tạo "bảo mật."

(function() {/ * Mã * /}()); // Crockford khuyến cáo này một

(function() {/ * Mã * /})(); // Nhưng cái này cũng hoạt động tốt như

Các vấn đề liên quan