2010-08-31 21 views

Trả lời

5

Tôi đã nhìn thấy nó thường xuyên gần đây. Tôi đoán:

Không cần đặt tên hàm. Nó ngụ ý nó không thể tái sử dụng được. Điều này cung cấp cho bạn phạm vi địa phương để khai báo các biến bằng cách sử dụng var (nếu không, bạn sẽ thêm chúng vào toàn cục).

0

Đó là closureanonymous function - các khái niệm chính trong Javascript. Javascript không có các thuộc tính hoặc trường riêng tư 'thực sự' - nhưng bằng cách sử dụng một đóng, bạn về cơ bản có thể tạo ra tương đương. Chúng là một phương tiện rất quan trọng để tổ chức JS.

Một điểm quan trọng trong mẫu này là (); ở cuối mã - thêm các dấu ngoặc đơn này yêu cầu mã Javascript là thực thi ngay lập tức - khởi động có hiệu quả bất kỳ nội dung nào được chứa bên trong.

http://www.jibbering.com/faq/notes/closures/


Để giúp làm rõ (Tôi không có JS-chuyên gia) - cấu trúc này, ngay cả khi không phải là một đóng tinh khiết, thường được nhìn thấy trong kết hợp với đóng cửa. Ví dụ, đoạn mã dưới đây (sao chép từ liên kết của tôi ở trên) sử dụng cú pháp này để xác định một phương pháp ẩn nội bộ:

function callLater(paramA, paramB, paramC){ 
    /* Return a reference to an anonymous inner function created 
     with a function expression:- 
    */ 
    return (function(){ 
     /* This inner function is to be executed with - setTimeout 
      - and when it is executed it can read, and act upon, the 
      parameters passed to the outer function:- 
     */ 
     paramA[paramB] = paramC; 
    }); 
} 

... 

/* Call the function that will return a reference to the inner function 
    object created in its execution context. Passing the parameters that 
    the inner function will use when it is eventually executed as 
    arguments to the outer function. The returned reference to the inner 
    function object is assigned to a local variable:- 
*/ 
var functRef = callLater(elStyle, "display", "none"); 
/* Call the setTimeout function, passing the reference to the inner 
    function assigned to the - functRef - variable as the first argument:- 
*/ 
hideMenu=setTimeout(functRef, 500); 

Mặc dù: ví dụ này không thực hiện ngay lập tức (nó thiếu ();) sau định nghĩa hàm bên trong. Vì vậy, trong trường hợp này, hàm được đính kèm được đánh giá tại một thời điểm sau đó - những () tạo ra một sự khác biệt lớn trong một ngôn ngữ chức năng.

+0

Một đóng cửa, như bạn đã nói, là một khái niệm then chốt trong JavaScript. Nhưng về cơ bản là giữ hoặc tránh tham chiếu đến các biến thuộc về ngữ cảnh thực thi của hàm truy cập chúng. Vấn đề ở đây là không có bất kỳ biến nào, và rằng nó không phải là vấn đề của câu hỏi. Tôi không làm cho bất kỳ biến có thể truy cập bên ngoài bối cảnh ban đầu của nó. Vì vậy, .., nơi có bất kỳ đóng cửa ở đây? Tôi thấy phù hợp với một downvote ("Câu trả lời là không hữu ích"). Nếu bạn muốn, tôi có thể lấy nó ra, nhưng câu trả lời của bạn có rất ít điểm chung với phần còn lại. – DanC

+0

"không có biến nào". - không có gì trong ví dụ này, tôi cho rằng trường hợp bạn đang kiểm tra có thể chứa các thành viên như các biến và các chức năng khác, dẫn đến việc đóng vai trò này. Đó là điều tôi hiếm khi thấy đối với kịch bản lệnh đơn giản/thủ tục Javascript – STW

+0

Xin lỗi STW, tôi không có ý nói thô lỗ, nhưng, bạn có thấy các phản hồi khác không? Bạn có thể tranh luận cả ngày, nhưng vào thời điểm này có vẻ như rõ ràng những gì tôi đã hỏi (đưa ra tất cả các phản ứng khác), và câu trả lời của bạn chỉ không phù hợp. Đây thực ra là một bản sao chính xác của một câu hỏi khác mà tôi không tìm được. Cảm ơn dù sao để trả lời, nhưng câu trả lời của bạn có thể phù hợp hơn cho một câu hỏi khác, có lẽ là về đóng cửa. Ngoài ra, câu trả lời của bạn dường như đã thay đổi rất nhiều kể từ câu trả lời ban đầu của bạn. – DanC

0

Được sử dụng để chạy mã OUT trong phạm vi toàn cầu. Với điều này, bạn đang sử dụng phạm vi chức năng. Trong trường hợp này, phạm vi của một hàm ẩn danh.

Điều này hữu ích khi bạn không muốn tạo các vars toàn cầu, chẳng hạn.

Xem:

var b = 2; 
(function(){ 
    var a=1; 
    alert("a:" + a); // alerts 1 
    alert("b:" + b); // alerts 2 
})(); 
alert("OUT b:" + b); // alerts 2 
alert("OUT a:" + a); // undefined 

Xem trong jsfiddle.


EDIT:

Cú pháp ()() là một cách khác để gọi một hàm. Xem

alert(1); // alerts 1 
(alert)(2); // alerts 2 

Xem trong jsfiddle.

+0

Cảm ơn bạn đã chỉnh sửa về kỹ thuật gọi thay thế()() ... Tôi không bao giờ có thể tìm thấy bất cứ nơi nào mà chỉ cần tuyên bố nó đơn giản! – exoboy

0

Cách xác định hàm và gọi ngay lập tức. thats những gì cuối cùng(); làm.

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