2013-03-08 24 views
5

Cách phổ biến để bảo toàn ngữ cảnh của this là gì? Điều gì sẽ nhanh hơn? Bạn thích cái gì hơn?

  1. $ .proxy (...)

    $('a').on('click', $.proxy(function() { 
        this.close(); 
    }, this)); 
    
  2. var tự

    var self = this; 
    
    $('a').on('click', function() { 
        self.close(); 
    }); 
    
+0

Tôi thích '$ .proxy()' –

+0

Thống kê cá nhân của tôi vẫn ở khoảng năm mươi lăm mươi. Trong tất cả sự nghiêm túc: Chọn một và gắn bó với nó. FYI, '$ .proxy' giống như phương thức' .bind' gốc của hàm. –

+0

Nhanh hơn như thế nào? Về mặt thực thi, bạn phải [điểm chuẩn] (http://jsperf.com). Tôi thích cái gì hơn? Tôi muốn đi với tùy chọn thứ hai bởi vì nó chỉ dễ đọc hơn với tôi. –

Trả lời

2

Hãy bắt đầu bằng cách sửa chữa mã của bạn. Bạn có một khai báo hàm vô dụng, bạn có thể sử dụng $.proxy như

$('a').on('click', $.proxy(this.close, this)); 

Bây giờ, giải pháp thứ hai dựa trên self

  • chỉ đòi hỏi cơ bản javascript kiến ​​thức
  • không đòi hỏi jQuery
  • là dễ đọc hơn một chút, đặc biệt khi bạn thường sử dụng lại biến số self
  • của bạn nhanh hơn nhiều

Đó có thể là lý do tại sao nó được sử dụng nhiều hơn.

Lưu ý rằng khi bạn không cần phải tương thích với IE8, bạn có thể sử dụng bind:

$('a').on('click', this.close.bind(this)); 
0

Chọn một đầu tiên. không yêu cầu thêm biến.

1

Cả hai đều phổ biến.

Tốc độ trong trường hợp này không liên quan. Người dùng sẽ không nhận thấy nếu cuộc gọi lại cho nhấp chuột bắt đầu sau 0,01 mili giây. hoặc 0,1 mili giây.

Trong trường hợp hiếm hoi, nó sẽ là vấn đề, tôi hy vọng phương pháp biến sẽ nhanh hơn một chút, nhưng bạn sẽ phải đánh giá nó.

Tùy chọn cá nhân của tôi thay đổi, tùy thuộc vào nơi nó được sử dụng và mã nào bên trong gọi lại. Một lợi thế của phương thức biến là nó hoạt động cho các cuộc gọi lại lồng nhau mà không cần phải áp dụng lại nó cho mỗi cấp.

+2

Có một lý do khác để chọn cách hiệu quả hơn chỉ là thời gian phản ứng: nếu các hành động bắt đầu 0,1 ms thay thế của 0,01 ms sau khi nhấp chuột có nghĩa là nó có 0.Hơn 09 giây thực hiện JS, mà trên một điện thoại thông minh trực tiếp dẫn đến mất nhiều pin hơn cho cùng một hành động. Chắc chắn nó thực tế không có gì, nhưng nó tích lũy nhanh. Ngoài ra, chỉ cho bản ghi: 0,1 đến 0,01 vẫn là một cải tiến 1000% sau khi tất cả;). – Simon

+0

@Simon: Bạn đang tối ưu hóa vi mô. Nếu bạn muốn tối ưu hóa, chắc chắn có những thứ khác trong mã của bạn, nơi bạn có thể tiết kiệm được nhiều thời gian thực thi hơn. – Guffa

+2

Đúng, nhưng đó là về nguyên tắc lựa chọn cách hiệu quả hơn nói chung, không phải là tiết kiệm thời gian thực tế bạn sẽ nhận được trong ví dụ này. – Simon

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