javascript - 关于一个闭包的问题
ringa_lee
ringa_lee 2017-04-11 13:14:55
[JavaScript讨论组]

在廖雪峰博客上看到讲闭包这一节的知识,最后脑洞大开那一块的代码没有搞懂,代码如下:

'use strict';

// 定义数字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));
        }
    }
}

闭包
这是原文链接,有谁能讲解下他那个add()的逻辑,到底是怎样子的?

ringa_lee
ringa_lee

ringa_lee

全部回复(2)
PHPz
var zero = function (f) {
    return function (x) {
        return x;
    }
};

这个东西调用两次能返回一个结果,zero(f)(x) = x,结果和f无关,和x有关。我们声明一个变量

var x = 0;

有了 zero(f)(x) === 0

var one = function (f) {
    return function (x) {
        return f(x);
    }
};

同样one(f)(x) = f(x)结果和f有关,f(x) === 1,我们定义一个f函数,让他满足这一点。

var f = function(x){
    return x + 1;
}

有了one(f)(x) === 1

function add(n, m) {
    return function (f) {
        return function (x) {
            return m(f)(n(f)(x));
        }
    }
}

根据这个可以得到

var two = add(one,one) = function(f){
    return function(x){
        return one(f)(one(f)(x));
    }
}

two(f)(x) = one(f)(one(f)(x)) = one(f)(1) = f(1) = 2

var three = add(two,one) = function(f){
    return function(x){
        return one(f)(two(f)(x));
    }
}

three(f)(x) = one(f)(two(f)(x)) = one(f)(2) = 3

...
天蓬老师

把整个过程以代码和注释的形式解析并运行了,看看是否能够给你提供帮助:

one和f的定义:

// 定义数字1:
var one = function (f) {
    return function (x) {
        return f(x);
    }
};

function f (x) {
  console.log(x);
  return x;
}

add的定义和解释:

// 定义加法:
function add(n, m) {
    return function (f) {
        return function (x) {
            /*
             * 以add(one, one)为例解释我的理解:
             * two = add(one, one);
             * two的函数原型为: one(f)(one(f)(x))
             * 那么现在假设有一个function f,它长这样:
             * function f(x) {
             *   console.log(x);
             *   return x;
             * }
             * 则(two(f))(5)的执行为:one(f)(one(f)(5))
             * 而one的定义为:
             * var one = function (f) {
             *   return function (x) {
             *     return f(x);
             * };
             * 最终的执行为:
             * 1. 5  // console.log(5);
             * 2. one(f)(5)
             * 3. 5  // console.log(5);
             */
            return m(f)(n(f)(x));
        }
    }
}

调用执行:

var two = add(one, one);


one(f)(one(f)(5));

console.log('---------------');

(two(f))(5); // or two(f)(5);

结果:

5
5
---------------
5
5
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号