一、偏函数:在函数调用现场(function call-site),将实参应用(apply) 于形参。
function getPerson(data,cb) {
ajax( "http://some.api/person", data, cb );
}
function getOrder(data,cb) {
ajax( "http://some.api/order", data, cb );
}
getOrder(data,cb) 是 ajax(url,data,cb) 函数的偏函数(partially-applied functions)。
更正式的说法是:偏函数严格来讲是一个减少函数参数个数(arity)的过程;这里的参数个数指的是希望传入的形参的数量。我们通过 getOrder(..) 把原函数 ajax(..) 的参数个数从 3 个减少到了 2 个。
二、函数柯里化:将一个期望接收多个实参的函数拆解成连续的链式函数(chained functions),每个链式函数接收单一实参(实参个数:1)并返回另一个接收下一个实参的函数
curriedAjax( "http://some.api/person" )
( { user: CURRENT_USER_ID } )
( function foundUser(user){ /* .. */ } );
var personFetcher = curriedAjax( "http://some.api/person" );
var getCurrentUser = personFetcher( { user: CURRENT_USER_ID } );
getCurrentUser( function foundUser(user){ /* .. */ } );
如果一个原函数期望接收 5 个实参,这个函数的柯里化形式只会接收第一个实参,并且返回一个用来接收第二个参数的函数。而这个被返回的函数又只接收第二个参数,并且返回一个接收第三个参数的函数。依此类推。
由此而知,柯里化将一个多参数(higher-arity)函数拆解为一系列的单元链式函数。
一些备忘:
闭包通过词法作用域提供“私有”状态,而对象将一切做为公共属性暴露。
提升代码可读性的唯一真相就是减少表面掩盖,读者必须可以预见到每一个给定变量的行为。
使有了闭包,你就有了一些可以更改代码的权限,而剩余的程序是受限的。当我们冻结一个对象,代码中没有任何部分可以被重设。此外,一旦一个对象被冻结,它不能被解冻,所以所有属性在程序运行期间都保持只读。
在我想允许重新赋值但是在表层限制的地方,闭包比起对象更方便和灵活。在我不想重新赋值的地方,一个冻结的对象比起重复 const 声明在我所有的函数中更方便一些。
通过const声明一个数组或者对象,对象的值或者数组的值是可以改变的,因为const只保存了其引用的地址,只会通过地址去找值。
网友评论