在使用方法作为事件处理程序(即$(...).on('something', myObject.handleSomething)
)的上下文中。我发现$ .proxy和_.bind(http://jsperf.com/bind-vs-jquery-proxy/27)之间的性能差异相对较大,并查看了它们的实现。
jQuery(http://james.padolsey.com/jquery/#v=1.10.2&fn=proxy)最终返回:
args = core_slice.call(arguments, 2);
proxy = function () {
return fn.apply(context || this, args.concat(core_slice.call(arguments)));
};
而下划线(http://underscorejs.org/docs/underscore.html#section-60)最终返回(ctor为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;
};
我理解_.bind
允许我绑定new
调用的参数,但如果我只想使用myObject.handleSomething
作为事件处理程序,它会有任何实际优势吗? / p>
是否可以使用_.bindAll
撰写与$.proxy
类似的内容? E.g。
$.proxyAll = function (obj) {
for (var attr in obj) if (obj.hasOwnProperty(attr) && $.isFunction(obj[attr])) {
obj[attr] = $.proxy(obj[attr], obj);
}
return obj;
};
答案 0 :(得分:5)
你确定你在衡量你关心的表现吗?
似乎您的测试用例正在测量绑定函数的性能,而此测试用例测量绑定函数的性能: http://jsperf.com/bind-vs-jquery-proxy/38
你应该只对有限(和相对较小)次数的函数进行约束,因此性能并不重要。这对我来说是一个惊喜,但测量绑定函数的性能似乎会改变结果。
另请注意,您的原始测试结果因浏览器而异。