博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript中的函数currying(柯里化) 的理解
阅读量:7187 次
发布时间:2019-06-29

本文共 1836 字,大约阅读时间需要 6 分钟。

hot3.png

首先简要说一下什么是curry化 :它是一种通过把多个参数填充到函数体中,实现将函数转换成一个新的经过简化的(使之接受的参数更少)函数技术.(摘自:精通JavaScrtpt图灵计算机科学丛书-21页)

//写一个简单点的

function curry(fn/*function*/ , scope/*object?*/){

    //取到除必须参数的其他参数,也就是第二个以后的所有参数,做一个缓存

    var args = [].slice.call(arguments , 2);

    console.log(args)

    scope = scope || window;//这里是第二个参数也作为可选参数,加一个默认值

    return function(){//返回一个新方法

        return fn.apply(scope , args.concat([].slice.call(arguments)));

        /**

         * 每一个function都有一个apply方法和call方法

         * 他们的作用基本是一样的,用来修改当前方法执行时的this指针

         * 比如

         * function test(a , b){

         *   this.alert(a + b);

         * }

         * test.call(window , 1 , 2);//运行test,将里面的this指向window,并且传参数为1 , 2

         * test.apply(window , [1 , 2]);//运行test,将里面的this指向window,传参数为1 , 2

         * 只不过是一个直接传参数,一个将参数作为数组传

         * 上面的fn.apply(scope , args.concat([].slice.call(arguments)))

         * 这里args本身就是一个数组,上面已经转换过了

         * 在和当前的参数列表用数组的concat方法合并成一个新的数组,传给apply方法

         * 并且将作用域绑定为scope

         */

    }

}

 

//首先呢,

// [].slice.call(arguments)这个用法是把实参列表转换成一个真正的数组

//[].slice.call(arguments, 2)这样是取第几个往后的

//比如

// function test(){

//  alert([].slice.call(arguments))

// }

//test(1,2,3,4,5)//这里就会弹出数组[1,2,3,4,5]

//function test2(){

//  alert([].slice.call(arguments , 2));//取第二位往后的参数

//}

// test2('a' , 'b' , 1 , 2 , 3)      这里为弹出数组[1,2,3],前面的俩个会忽略

//ok,上面是一些小技巧,下来是科里化的问题

//执行curry(fn , scope , args...)

//第一个参数,明显是一个方法

//第二个参数是指定这个方法的this指向,也就是作用域

//然后接下来的参数会被缓存到那个变量args里面,当然也可以不传,是可选的

//执行curry之后,返回一个新的方法,执行这个方法,和直接执行的fn左右差距不大,但是可以用来锁定this作用域指向

//也可以用来缓存简化一些参数

//做个例子

 

var obj = {

    testFn : function(a , b , c , d , e , f , g){//假设需要穿N多的参数

        return a + b + c + d + e + f + g;

    }

};

 

console.log(obj.testFn(1, 2 , 3 , 4 , 5 , 6 , 7));//返回这个参数所有的和28

 

//用科里化可以简写参数,将参数分次传递

var fn = curry(obj.testFn , obj , 1, 2 , 3 , 4);

//这里,第一个参数传方法,第二个参数传一个对象,后面传一部分参数

//这些参数会被缓存起来,而且整个方法暂时不会执行

console.log(fn(5 , 6 , 7));//28

//因为上面利用科里化已经缓存了部分参数,这里就可以简化参数,传剩下的几个参数就可以了

 

//上面将的是科里化的基本作用和里面的原理

转载于:https://my.oschina.net/u/1040928/blog/373773

你可能感兴趣的文章
python3读取chrome浏览器cookies
查看>>
android 网络编程 HttpGet类和HttpPost类使用详解
查看>>
数据可视化-EChart2.0使用总结1
查看>>
前后端分离下如何登录
查看>>
AJAX学习1
查看>>
effective c++条款5 了解编译器默认编写那些函数
查看>>
深入理解指针函数
查看>>
添加图片后xcode报错:resource fork, Finder information, or similar detritus not allowed
查看>>
CSS-背景渐变的兼容写法
查看>>
正则表达式--列表
查看>>
Unity3D占用内存太大的解决方法
查看>>
记一次基于Unity的Profiler性能分析
查看>>
Educational Codeforces Round 57题解
查看>>
windows10安装centos7双系统详细教程
查看>>
JVM构架、GC垃圾回收机制的理解
查看>>
HDU-1242 Rescue BFS+优先队列
查看>>
嵌入式C语言自我修养 02:Linux 内核驱动中的指定初始化
查看>>
BootStrap框架及其他框架布局技术
查看>>
极值和最值
查看>>
LOJ #2183「SDOI2015」序列统计
查看>>