我有个关于带注释的underscore.js源代码的问题
上面写着:
内部函数,该函数返回传入回调的有效版本(对于当前引擎),以便在其他下划线函数中重复应用。
var createCallback = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value);
};
case 2: return function(value, other) {
return func.call(context, value, other);
};
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};明确地说,如何在这个代码块中达到效率?
因为我看到,使用包装器,创建了一个多级别的间接,而作用域链又增长了一个二级。
我需要了解如何达到效率,以便在我自己的js中应用这个技巧。
谢谢!
发布于 2014-11-05 14:47:43
论点顺序似乎有些混乱,但如果以后的论点空空如也,其中一些情况实际上是等价的。我认为这种逻辑也可能使回调与浏览器优化很好地结合在一起。例如,如果返回值是可预测的,那么结果可能是内联的,而不是每次调用实际的函数。下面是有关性能和参数的相关讨论,在这些讨论中,测试显示了一些巨大的速度差异:
发布于 2014-11-05 14:40:18
当使用下划线迭代器函数(如_.map、_.reduce和_.each)时,所提供的回调提供了不同的参数。例如:
_.map(list, function(value, key, list) {});
_.reduce(list, function(memo, num, list) {});createCallback是由下划线在内部使用的一个方便函数,用于定义这些迭代器函数中参数的顺序。如果我们查看_.reduce函数,我们可以看到这一行:
iteratee = createCallback(iteratee, context, 4);将产生以下结果:
func.call(context, accumulator, value, index, collection);其中func是提供给_.reduce的迭代器函数。
https://stackoverflow.com/questions/26759412
复制相似问题