underscore(lodash) bind 源码疑惑

发布于 2022-09-04 13:24:22 字数 416 浏览 14 评论 0

源码版本是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的时候为什么还要把之前的参数链接上去呢?

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

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

发布评论

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

评论(2

请你别敷衍 2022-09-11 13:24:22
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
空城仅有旧梦在 2022-09-11 13:24:22

clipboard.png

args 是预绑定参数,实际调用时可能还会传入额外的参数,所以要加到一起。

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