javascript - 关于一个闭包的问题

查看:122
本文介绍了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()的逻辑,到底是怎样子的?

解决方案

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

...

这篇关于javascript - 关于一个闭包的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆