2013-09-06 33 views
6

Tôi đang tìm hiểu về JS/JQuery và các chức năng và đóng ẩn danh. Tôi đã nhìn thấy các ví dụ như sau:Chi phí bộ nhớ của các chức năng ẩn danh và chức năng được đặt tên khi được sử dụng như các cuộc gọi lại Jquery

$('.button').click(function(){ 
    /* Animations */ 
    /* Other Stuff */ 
}); 

Nếu có nhiều nút thì không hiệu quả? Không phải là chỉ lưu trữ các bản sao tương tự của nguyên mẫu của một hàm ẩn danh trong bộ nhớ? (sửa thuật ngữ của tôi) Không phải là nó tốt hơn để làm điều này:

function handleClick(){ 
    /* Animations */ 
    /* Other Stuff */ 
} 

('.button').click(handleClick); 

Hoặc ngay cả điều này, nếu một tham chiếu đến nút là cần thiết:

function handleClick($obj){ 
    /* Animations */ 
    /* Other Stuff */ 
} 
//multiple anon functions again, but they all reference ONE handleClick function 
('.button').click((function($obj){   
    return function(){handleClick($obj)}; 
})($(this)); 
+0

Tôi không nghĩ rằng phiên bản đầu tiên bạn đã viết thực sự "nhái" trình xử lý ... Tất cả phần tử sẽ chia sẻ cùng một tham chiếu! –

+0

Vì vậy, JQuery đủ thông minh để chỉ đính kèm một trình xử lý? – Alex

+0

Tôi không nghĩ rằng đó là vấn đề của jQuery hay không, bạn vượt qua một tham chiếu hàm duy nhất, do đó, một tham chiếu duy nhất được sử dụng. –

Trả lời

2

Theo thiết kế, the observer pattern chỉ giữ một ví dụ của người quan sát. Trình xử lý sự kiện sau đó gọi người quan sát này nhiều lần, với các trường hợp khác của một đối tượng sự kiện, chứa các tham số sự kiện: phần tử nào đã kích hoạt sự kiện, ngữ cảnh là gì, ... v.v.

Vì vậy trình xử lý không bị trùng lặp, nhưng được tham chiếu trong 'kho lưu trữ thính giả' của mỗi đối tượng.

Lưu ý:
Kemal Dag cũng lưu ý rằng các chức năng ẩn danh theo định nghĩa cung cấp hiệu suất ít sau đó đặt tên chức năng, tôi không biết nếu nó là đúng, nhưng nếu nó là, sự khác biệt là không đáng kể. Đặc biệt đối với một ngôn ngữ như JavaScript, sử dụng các hàm anon quá rộng, nó không thể đủ khả năng tác động đến hiệu năng trên nó.

3

Khi bạn sử dụng các hàm được đặt tên, nó chỉ tồn tại khi đóng cửa toàn cầu, nhưng nếu bạn xác định hàm trong thời gian chạy, chúng được tạo bên trong (đóng của hàm cha). không cần chức năng đó nữa.

Trong ngắn hạn, hãy thử các chức năng ẩn danh chỉ khi bạn cần truy cập các biến nằm trong hàm mẹ. Các hàm ẩn danh gần như luôn đắt hơn sau đó được đặt tên hàm. Nhưng các chức năng được đặt tên được định nghĩa trong việc đóng cửa toàn cầu, gây ô nhiễm không gian tên toàn cầu, quyết định cho chính bạn.

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