理解Javascipt函数柯里化

本文深入探讨了JavaScript中函数柯里化的实现原理。通过具体示例,解释了如何使用闭包和数组方法来延迟函数执行并传递参数,展示了柯里化在函数式编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 《JavaScript高级程序设计》第22章关于函数柯里化的理解

function curry(fn){
    var args=Array.prototype.slice.call(arguments,1);
    return function(){
        var innerArgs=Array.prototype.slice.call(arguments);
        var finalArgs=args.concat(innerArgs);
        return fn.apply(null,finalArgs);
    };
}

function add(num1,num2){
    return num1+num2;
}

var curriedAdd=curry(add,5);
alert(curriedAdd(3))//8
var curriedAdd2=curry(add,5,12);
alert(curreidAdd2());//17

首先理解第一句:

    var args=Array.prototype.slice.call(arguments,1);

      Array对象是用于构造数组的全局对象,slice 方法可以用来将一个类数组(Array-like)对象/集合转换成一个新数组。你只需将该方法绑定到这个对象上。 一个函数中的 arguments 就是一个类数组对象的例子。除了用 Array.prototype.slice.call(arguments),也可以简单的使用 [].slice.call(arguments) 来代替。

所以这句话的意思就是把传入curry的参数从第二个开始复制到变量args里,例如curry(add,5,12),这时args里面就保存[5,12],去掉了add函数这个参数。

 

var innerArgs=Array.prototype.slice.call(arguments);

这句话的意思和上一句差不多,只是此时调用slice,不传入任何参数,所以默认传入第一个参数为0,若

var curriedAdd=curry(add,5);因此变量innerArgs中保存的是curriedAdd(3)传入的参数[3]

 

 var finalArgs=args.concat(innerArgs);
 return fn.apply(null,finalArgs);

finnalArgs等于args和innerArgs拼接后的值,而后的apply方法中第一个参数为null,代表fn作用域指向window(在nodejs环境中指向global).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值