Discuss / JavaScript / 理解

理解

Topic source

大前提是所有字母 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()。
*/

  • 1

Reply