大前提是所有字母 f 被看作某种function/函数/method的变量,而不是具体的object/数据/某种值。下面注释解释中用的=号不是赋值,而是表示数学里的计算结果的=号。。
'use strict'; // 定义数字0: var zero = function (f) { return function (x) { return x; } }; /* => 实际效益为“0次”,这个zero() 函数/method 不做任何事情,因为参数f在内部被无视,所以zero()实质意义上不做任何事情 继续解构的话: zero(随意函数) = function (x) {return x;} zero(随意函数)() = (function (x) {return x;})(); = undefined //因为最后面"()"啥也没传进去,所以function(空)接收了undefined也会传出来一个undefined,传个x的话zero(随意函数)(x)也只会返回一个x,那个“随意函数”被完全无视。 */ (zero(function () { console.log('print 0 times'); }))(); //等同于"(zero(无效函数))();" ================================================================= // 定义数字1: var one = function (f) { return function (x) { return f(x); } }; /* => 实际效益为“1次”,因为method "one()"实质意义为跑一遍传进去的函数,即one(f)等于跑一遍不带任何参数的f(), one(f)(x)等于跑一遍f(x) 按步解构为: one(函数f) = function (x) {return f(x);} one(函数f)() = (function () {return f();})(); = f(); //因为中间代码里最后的"()"啥也没传进去,所以(function () {return f();})()实际意义就是返回了一个f()而f()也会被触发跑一遍。 */ (one(function () { console.log('print 1 times'); }))(); //如上解释 ================================================================= // 定义加法: function add(n, m) { return function (f) { return function (x) { return m(f)(n(f)(x)); } } } /* => 实质为m()(n()()),比如可以看成一个m(f)()和一个n(f)(),但因为第二个括号用来传参数进到那个m()或n()取出来的function(),而且一般不起作用(比如那个one(f)()的第二个括号就是毫无意义的)所以实质上就是n(f)()先跑n次数f(),再到m(f)()跑m次 => 假设m和n都是one,去掉完全没用的x留下象征意义的f,那么one(f)(one(f)()) = one(f)(f())=f(f())等于跑了两次f()。 */
Sign in to make a reply
「Alicer」雨无
大前提是所有字母 f 被看作某种function/函数/method的变量,而不是具体的object/数据/某种值。下面注释解释中用的=号不是赋值,而是表示数学里的计算结果的=号。。