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;
};
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? –
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