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('print 2 times');
}))();
这个程序打印出两次'print 2 times'
但是我推理感觉有问题,
1、我的理解是先执行:
two(function () {
console.log('print 2 times');
});
得到的应该是:
function (x) {
return m(f)(n(f)(x));
}
这里
f=function () {
console.log('print 2 times');
}
而这里m,n都是one这个函数。
2、然后是一个立即执行的匿名函数,即是:
one(f)(one(f)(x));
3、然后 one(f)(x)
这应该是一个立即执行函数:
function (x) {
return f(x);
}(x)
得到:f(x)
4、最后的表达式却变成
function (x) {
return f(x);
}(f(x))
即是 f(f(x))
;
似乎可以说的通,但是问题在第三步和第四步,两个立即执行函数都没有加括号,不知道我的理解哪里有问题,请各路大神帮忙梳理一下,万分感谢!
为什么需要加括号?因为要把一个函数定义变成函数表达式!
然后作为返回值的函数表达式,本身已经是函数表达式了,所以不需要加括号,可以直接调用。