function - underscore(lodash) bind 源码疑惑

查看:156
本文介绍了function - underscore(lodash) bind 源码疑惑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

源码版本是0.1.0

function bind中的实现方式如下

bind: function(func, context){
        if(!context) return func;
        var args = _.toArray(arguments).slice(2); //出去 func,context的剩余可选参数
        return function(){
            var a = args.concat(_.toArray(arguments));   //为什么这里还需要加上所有的参数,有什么作用?
            return func.apply(context, a);
        };
    }

最后apply的时候为什么还要把之前的参数链接上去呢?

解决方案

bind: function(func, context){//A
        if(!context) return func;
        var args = arguments.slice(2); //[1]
        return function(){//B
            var a = args.concat(_.toArray(arguments));   //[2]
            return func.apply(context, a);
        };
    }

:[1] 此处的arguments时函数A的实际传入参数
:[2] 此处的arguments时函数B的实际传入参数,将args和函数B的实际传入参数合并作为原始传入参数-func-的调用参数,context作为上下文

作用为函数的柯里化,如下面的例子:

var bind=function(func, context){//A
        if(!context) return func;
        var args = Array.prototype.slice.apply(arguments,[2]); //[1]
        return function(){//B
            var a = args.concat(Array.prototype.slice.apply(arguments,[0]));   //[2]
            return func.apply(context, a);
        };
};
var orgFun=function(){
    var args=Array.prototype.slice.apply(arguments,[0]);
    var initvalue=this.initValue||0;
    var result=0;
    args.forEach(function(item){
        result=result+item;
    });
    return initvalue+result;
}
var boundFun=bind(orgFun,{initValue:100},1,2,3);
var result=boundFun(4,5,6);
console.log("result:"+result);//121

这篇关于function - underscore(lodash) bind 源码疑惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆