// 定义数字0:
var zero = function (f) {
return function (x) {
return x;
}
};
// 定义数字1:
var one = function (f) {
return function (x) {
return f(x);
}
};
// 定义加法:
function add(n, m) {
return function (f) {
return function (x) {
return m(f)(n(f)(x));
}
}
}
var two = add(one,one);
(two(function(){console.log(1);}))();
请问这段代码啥意思?
就是为了做闭包,zero,one的f参数为函数,javascript任何类型都可以返回。
写这种代码的人也是吃饱了撑着了的。。上面2句大概意思如下,自己慢慢拆分语句就清楚了
var two = add(one, one);
(two(function () { console.log(1); }))(22); //可以理解如下
two = function (f) {//f为下面的传入two函数的twoParam
return function (x) {//x为下面执行twoReturn的参数,第3)部,由于没有传递,所以x为undefined
return m(f)//这个的执行和n(f)(x)一个意思
(
n(f)(x)//执行one(f)后得到one返回的匿名函数 function (x) { return f(x);},然后将x传入匿名函数执行,等同于twoParam(x),控制台打印出1
);
}
}
(two(function () { console.log(1); }))();可以理解如下
1)twoParam=function () { console.log(1); }//twoParam存储two的匿名函数参数
2)twoReturn=two(twoParam)//传入twoParam参数执行two匿名函数得到返回的匿名函数
3)twoReturn()执行two返回的匿名函数
这段代码里所有的参数都应该是函数.那么应该这样理解:
// 定义数字0:
var zero = function (f) {
return function (x) {
return x;
}
};
把函数参数f看作某个即将传入的函数变量,就直接叫f好了.那么zero实际应该是 var zero(f) = () ;
// 定义数字1:
var one = function (f) {
return function (x) {
return f(x);
}
};
同理,因为f为函数变量.则 var one(f)() = f()
这样的一次执行过程执行一次,被计为数字1.
// 定义加法:
function add(n, m) {
return function (f) {
return function (x) {
return m(f)(n(f)(x));
}
}
}
这里为了好理解,把加法add(m,n)的两个参数都用one这个函数变量传进去好了.
因为add(n,m) =>m(f) ( n(f)(x) ),那么:
add(one,one)=> one(f) ( one(f)(x) ).
这个表达式由两部分组成:
1)one(f) ( ) 因为one(f)() = f() 所以one(f)( ) => f( )
2) one(f)(x) 因为one(f)()=f( ) 所以one(f)(x)= f(x)
因此:
one(f)(one(f)(x) ) => f (f(x))
以上的结果可以记为2,tow(f) => f( f( ) )
可以有0 => x , 1 => f(x) 2=>f(f(x))....这样的自然数到函数执行次数的映射.