2009-03-30 33 views
16

tôi đang học YUI và đã thỉnh thoảng nhìn thấy thành ngữ này:ngữ Javascript: tạo một hàm chỉ để gọi nó

<script> 
    (function x(){ do abcxyz})(); 
</script> 

Tại sao họ tạo một hàm chỉ để gọi nó? Tại sao không chỉ viết:

<script> 
    do abcxyz 
</script> 

Ví dụ: xem here.

+0

Xem thêm: http://stackoverflow.com/questions/631187/javascript-scope-and-closure/ –

Trả lời

44

Chúng đang tận dụng lợi thế của closures.

Giải thích ngắn gọn: Vì JS sử dụng phạm vi cấp chức năng, bạn có thể thực hiện một loạt các hành động trong một hàm và giữ nó trong phạm vi đó. Điều này rất hữu ích cho việc gọi mã không gây rối với không gian tên chung. Nó cũng cho phép một biến riêng tư - nếu bạn khai báo một biến bên trong một hàm ẩn danh và thực hiện nó ngay lập tức, chỉ có mã khác bên trong hàm ẩn danh mới có thể truy cập biến đó.

Ví dụ: giả sử tôi muốn tạo trình tạo id duy nhất toàn cầu. Người ta có thể làm mã như thế này:

var counter = 0; 
var genId = function() 
{ 
    counter = counter + 1; 
    return counter; 
} 

Tuy nhiên, bây giờ bất cứ ai có thể gây rối với truy cập, và bây giờ tôi đã bị ô nhiễm không gian tên toàn cầu với hai biến (truy cậpgenId).

Thay vào đó, tôi có thể sử dụng một chức năng ẩn danh để tạo ra chức năng truy cập của tôi:

var genId = function() 
{ 
    var counter = 0; 
    var genIdImpl = function() 
    { 
     counter = counter + 1; 
     return counter; 
    } 

    return genIdImpl; 
}(); 

Bây giờ, tôi chỉ có một biến trong không gian tên toàn cầu, đó là thuận lợi. Quan trọng hơn, biến truy cập bây giờ là an toàn không bị sửa đổi - nó chỉ tồn tại trong phạm vi chức năng ẩn danh, và do đó chỉ có hàm genIdImpl (được định nghĩa trong cùng phạm vi) mới có thể truy cập nó.

Dường như trong mã ví dụ của YUI, họ chỉ muốn thực thi mã không gây ô nhiễm không gian tên chung.

3

Họ muốn tránh xung đột không gian tên, tôi đoán vậy. Có vẻ như là một thực hành tốt trong JS.

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