2011-01-26 34 views
16

Tôi thường thấy các biểu thức như:hàm javascript so với (hàm() {...}());

(function() { 
    var x = 1; 
    ... 
}()); 

Làm cách nào để diễn giải? về mặt cú pháp, điều này một mình là định nghĩa hàm ẩn danh.

function() { 
... 
} 

what the() sau đó? và tại sao đặt nó trong dấu()?

Cảm ơn

+0

@delnan: Bạn nói đúng, nhưng tôi nghĩ đó chỉ là một trong những câu hỏi khó tìm kiếm một chút. Mặc dù tôi sẽ đặt cược rằng nếu một người tìm kiếm * "Cú pháp này là gì trong javascript" *, họ sẽ gặp một vài câu trả lời. : o) – user113716

+2

@delnan - Tôi nghĩ bạn có thể đang ở trên trang web sai. Đây là Stack Overflow, nơi mọi người đến để được giúp đỡ. Bạn thua? Có lẽ bạn đang ở trên trang web sai? – jmort253

+0

@ delnan, tôi giả sử bằng cách đặt câu hỏi này cũng đang học, nhưng không phải ở cấp độ bạn thích hoặc cho là thích hợp. Tôi đã cố gắng tìm kiếm nó, nhưng không nhận được câu trả lời. và vì điều đó, tôi cảm ơn @patrick vì đã dành thời gian để trả lời tôi. – Oliver

Trả lời

24

Chính xác như cũ, ngoại trừ việc nó được gọi ngay sau khi được chuyển đổi thành biểu thức hàm.

// v-----first set of parentheses makes the function an expression 
    (function() { 
     var x = 1; 
     ... 
    }()); 
// ^-----this set is used to invoke the function 

Tương tự như nếu bạn đã làm:

var myfunc = function() { 
     var x = 1; 
     ... 
    }; 
    myfunc(); 

hoặc (tương tự) này:

var returnValue = function() { 
     var x = 1; 
     ... 
    }(); 

Loại bỏ những cái tên, di chuyển ngoặc xung quanh, và bạn có thể thấy họ' không phải là khác nhau.

+0

hmm, thú vị. Tôi đoán tôi cần phải đào sâu hơn vào ý nghĩa chính xác của biểu thức và hàm gọi, thx rất nhiều. – Oliver

+1

@Oliver: Có một số khác biệt tinh tế nhưng quan trọng giữa biểu thức hàm và khai báo. [Đây là một bài viết thực sự tuyệt vời] (http://kangax.github.com/nfe/) về các chức năng trong js. – user113716

+0

cảm ơn bài báo, đọc tốt. câu trả lời được chấp nhận. – Oliver

2

Khu vực mà tôi thường thấy hữu ích nhất là ở các chức năng gọi lại. Ký hiệu này cũng có thể được sử dụng trong trường hợp bạn cần đưa biến vào hàm gọi lại, nhưng bạn cần trạng thái biến không bị ảnh hưởng bởi những gì diễn ra bên ngoài hàm.

var someVal = 1; 

setTimeout((function(one) { 
     return function() { 
      alert(one); // alerts a 1 even 10 seconds after someVal++; 
     } 
})(someVal), 10000); 

someVal++; // the value in the setTimeout will remain the same as it is locked inside. 

Trong ngữ cảnh này, setTimeout có chức năng không có đối số. Vì vậy, câu hỏi về cách chuyển một giá trị cho hàm đó được trả lời bằng cách tạo ra một hàm nhận một đối số trả về một hàm lấy 0 đối số.

Tôi đề nghị bất cứ ai muốn tìm hiểu thêm về sức mạnh của ký hiệu này để chơi cùng với nó trong bảng điều khiển Firebug JavaScript. Một khi bạn quấn đầu xung quanh khái niệm này, bạn sẽ bắt đầu thấy các khu vực mà khái niệm mạnh mẽ này có thể được sử dụng.

+0

"CNTT" được gọi là gì? Nếu nó quá nóng, nó chắc chắn phải có một cái tên. –

+0

Tôi nghĩ cụm từ bạn đang tìm kiếm là "đóng cửa". Có một số cách sử dụng khác để đóng cửa, nhiều trong số đó tôi chưa có cơ hội khám phá. – jmort253

+0

thats những gì tôi nghĩ .. nhưng một số tìm kiếm nhanh chóng kéo lên rất nhiều thông tin dường như không liên quan .. và whats sự khác biệt giữa một 'đóng cửa' và' clojure', tôi tự hỏi? –

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