2013-09-27 353 views
5

Trong ngữ cảnh sử dụng các phương pháp làm trình xử lý sự kiện (ví dụ: $(...).on('something', myObject.handleSomething)). Tôi phát hiện ra sự khác biệt hiệu suất tương đối lớn giữa $ .proxy và _.bind (http://jsperf.com/bind-vs-jquery-proxy/27) và xem xét việc triển khai của chúng.jQuery.proxy vs. underscore.bind

jQuery (http://james.padolsey.com/jquery/#v=1.10.2&fn=proxy) kết thúc lên trở lại:

args = core_slice.call(arguments, 2); 
proxy = function() { 
    return fn.apply(context || this, args.concat(core_slice.call(arguments))); 
}; 

trong khi dấu gạch dưới (http://underscorejs.org/docs/underscore.html#section-60) kết thúc lên trở lại (ctor là var ctor = function(){};):

args = slice.call(arguments, 2); 
return bound = function() { 
    if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); 
    ctor.prototype = func.prototype; 
    var self = new ctor; 
    ctor.prototype = null; 
    var result = func.apply(self, args.concat(slice.call(arguments))); 
    if (Object(result) === result) return result; 
    return self; 
}; 

Tôi hiểu rằng _.bind sẽ cho phép tôi để ràng buộc đối số cho một cuộc gọi new, nhưng nó sẽ có lợi thế thực tế nếu tôi chỉ muốn sử dụng myObject.handleSomething làm trình xử lý sự kiện?

Có thể viết một cái gì đó tương tự như _.bindAll bằng cách sử dụng $.proxy? Ví dụ.

$.proxyAll = function (obj) { 
    for (var attr in obj) if (obj.hasOwnProperty(attr) && $.isFunction(obj[attr])) { 
     obj[attr] = $.proxy(obj[attr], obj); 
    } 
    return obj; 
}; 
+0

Có vẻ như bạn đang gặp sự cố ngữ cảnh khi sự kiện của bạn được xử lý bởi 'myObject.handleSomething' để bạn cố gắng ràng buộc ngữ cảnh với trình xử lý, tôi có đúng không? nếu có, tại sao không chỉ chuyển ngữ cảnh như một phần của dữ liệu sự kiện của bạn? –

+0

Có lẽ tôi hiểu lầm bạn, nhưng điều đó thậm chí không có ý nghĩa (làm thế nào tôi thậm chí sẽ đi về nhận được bối cảnh 'myObject' vào dữ liệu sự kiện?). Những gì tôi cần là 'Object.bind()', nhưng vì IE tôi cần sử dụng một thư viện. Có sự khác biệt về hiệu năng khá lớn giữa underscore.js và jQuery, nơi jQuery nhanh hơn nhiều. Phần đầu tiên của câu hỏi của tôi là liệu sự khác biệt tốc độ này là do thiếu tính tổng quát, và phần thứ hai của câu hỏi của tôi là liệu '_.bindAll()' có thể thực thi trực tiếp từ 'jQuery.proxy()'? – thebjorn

Trả lời

5

Bạn có chắc là bạn đang đo lường hiệu suất mà bạn quan tâm?

Có vẻ trường hợp thử nghiệm của bạn được đo lường hiệu suất của ràng buộc chức năng, trong khi trường hợp thử nghiệm này đo lường hiệu suất của hàm ràng buộc: http://jsperf.com/bind-vs-jquery-proxy/38

Bạn chỉ nên được chức năng ràng buộc một số hữu hạn (và tương đối nhỏ) của thời gian, vì vậy hiệu suất sẽ không thực sự quan trọng. Đó là một bất ngờ đối với tôi, nhưng việc đo hiệu suất của chức năng bị ràng buộc dường như làm lật các kết quả.

Ngoài ra, lưu ý rằng kết quả thử nghiệm ban đầu của bạn thay đổi trên các trình duyệt.

+2

Bắt tốt. (Điểm chuẩn không phải của tôi, nhưng tôi đã tìm thấy liên kết đến khi nghiên cứu triển khai liên kết). Tôi đã chạy điểm chuẩn với một bộ sưu tập các trình duyệt mà tôi đã có và thêm phiên bản 39 nơi tôi cũng thêm liên kết gốc. – thebjorn

+0

Ngoài ra tốt đẹp. Cảm ơn! Tôi không biết có một ràng buộc bản địa. – colllin

+0

Ngoài ra, cảm ơn cho các vết sưng đến 1k! :) – colllin