关于js函数执行的问题

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));

似乎可以说的通,但是问题在第三步和第四步,两个立即执行函数都没有加括号,不知道我的理解哪里有问题,请各路大神帮忙梳理一下,万分感谢!

阅读 2.6k
3 个回答

为什么需要加括号?因为要把一个函数定义变成函数表达式!

然后作为返回值的函数表达式,本身已经是函数表达式了,所以不需要加括号,可以直接调用。

没有必要去推理这种晦涩的代码的执行结果是什么,耽误时间。
你这里的代码就两个知识点,一个是函数柯里化,一个是立即执行函数,非要研究的话可以去进一步了解这两个知识点。

function fn(){
    var a = 1;
    return function(){
        console.log(a);
    }
}
fn()();        //1

你需要了解两点(可以参考边城的回答):

  • 只有函数表达式才能自执行,所以需要使用()将函数声明转换为函数表达式
  • fn函数返回的就是一个函数表达式,注意是匿名函数表达式,而不是函数声明。因为如果是函数声明就必须要有名称标识符

PS:团队中最重要的是代码可读性,不是写的越难越能显示水平。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题