underscore源码

发布于 2022-09-04 08:29:00 字数 1360 浏览 20 评论 0

var optimizeCb = 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)
        }
}

求教:上面是underscore的一段源码,让我比较困惑的是switch的作用,我觉得完全不需要switch啊,直接如果判断context==null,如果不是直接返回

return function () {
            return func.apply(context, arguments)
        }

上面这个不就可以吗?求各位大神指教啊?它的注释中说是

// Internal function that returns an efficient (for current engines) version
    // of the passed-in callback, to be repeatedly applied in other Underscore
    // functions.

请问是对于比较少参数的时候,用call这种方法会快不少吗?感觉有别的深意啊,毕竟我不觉得这个速度会差很多,可是实在想不到区别了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原谅我要高飞 2022-09-11 08:29:00

没有什么深意,单纯就是因为.call.apply快很多。

这个速度的差距可能会让你感到吃惊:即使在比较新的浏览器里(Chrome 50+),.call也比.apply快上一倍。旧一点的JS引擎中.call甚至能比.apply快10倍以上。

不信在Console里试试:

function work(a, b, c) {}

var a = [1, 2, 3];

for (var j = 0; j < 5; j++) {
  console.time('apply');
  for (var i = 0; i < 1000000; i++) {
    work.apply(this, a);
  }
  console.timeEnd('apply');

  console.time('call');
  for (var i = 0; i < 1000000; i++) {
    work.call(this, 1, 2, 3);
  }
  console.timeEnd('call');
}

原因在与.apply在运行前要对作为参数的数组进行一系列检验和深拷贝,.call则没有这些步骤。具体可以参考ECMA 5.1 标准:
http://www.ecma-international...
http://www.ecma-international...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文