javascript - 关于一个闭包的问题
本文介绍了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屋!
查看全文