JAVASCRIPT编入集

八、return function与柯里化

2017-12-28  本文已影响20人  loster
javascript编入集
函数是一等公民,离不开柯里化[1]的表示形式。
常规的一个add:
function add(a,b){
    return a+b
 }

柯里化后的add

function addCurry(a){ 
    return function(b){
        return a + b;
    }
}

在调用上也是有很大区别。

add(1,2); // 3
addCurry(1)(2) // 3

乍一看,这个东西和脱裤子放屁没什么区别。怎么说呢,一步的操作分为了两步。
那我们换一个

function add(a) {
    return function(b) {
        if (b === undefined) {
            var result = a;
            return a=undefined,result;
        } else {
            return a+= b, arguments.callee
        }
    }
}
 add(1)(2)(3)(4)() // 10

arguments.callee

这个属性返回当前正在执行的函数
为什么不用this呢?还记得js中的this指向的是函数拥有者,而不是函数本身吗,所以这里的this并不是该函数本身。
实际上在严格模式下,这个arguments.callee是不允许存在的。
上面的函数改写为

function add(a) {
    return function curry(b) {
        if (b === undefined) {
            var result = a;
            return a=undefined,result;
        } else {
            return a+= b, curry
        }
    }
}
add(1)(2)(3)(4)() // 10

仇归仇,恨归恨,不同的表现形式都是为了处理相同的事情,所以在核实的场景下选择合适的方法,而不是以不变应万变,编程就要随机应变不是吗。
来看一个柯里化组合的操作

function Color(color) {
    return function() {
        return color
    }
}

function Size(size) {
    return function() {
        return size;
    }
}

function link(fn, fn2) {
    return function(arg) {
        return arg + fn() + fn2();
    }
}
var green  = Color("green");
var yellow = Color("yellow ");
var large = Size('large');
var small = Size("small");
var smallyellow = link(small ,yellow );
var yellowsmall = link(yellow ,small );
smallyellow(" car ");
yellowsmall(" bike ");

附赠优秀的柯里化库 :ramdalodash


  1. 将多个参数表示形式,变为单个参数表示形式。

上一篇下一篇

猜你喜欢

热点阅读