我遇到了如下的javascript代码示例,尚不清楚其工作方式。我习惯于将函数作为回调传递,但我似乎无法理解
function cons(a, b) {
const pair = func => {
return func(a, b);
};
return pair;
}
function car(pair) {
return pair((a, b) => {
return a;
});
}
function cdr(pair) {
return pair((a, b) => {
return b;
});
}
console.log(cons(1, 2))
// ƒ pair(func) {return func(a, b);}
console.log(car(cons(1, 2)))
// 1
console.log(cdr(cons(1, 2)))
// 2
答案 0 :(得分:1)
变量func
带有参数a
和b
,因为它们是cons
函数中的参数。之所以会发生函数调用(我相信您是在谈论正在记录到控制台的函数),是因为cons
返回了一个您不会调用的函数-因此,您传递了更多的参数(回调函数),例如所以:
function cons(a, b) {
const pair = func => {
return func(a, b);
};
return pair;
}
function car(pair) {
return pair((a, b) => {
return a;
});
}
function cdr(pair) {
return pair((a, b) => {
return b;
});
}
cons(1, 2)(console.log);
console.log(car(cons(1, 2)))
// 1
console.log(cdr(cons(1, 2)))
// 2
答案 1 :(得分:1)
简单地说,这都是因为closure
而发生的!您正在调用函数cons
,该函数在内部返回另一个函数定义,该函数定义内部引用a
[父]函数范围内的属性b
和cons
。 / p>
要添加更多的灯光,让我们进行一些简单的更改,您就可以看到它,
function cons(a, b) {
const pair = func => {
console.log('a: ', a);
console.log('b: ', b);
};
return pair;
}
let childFun = cons(10, 30);
console.log(childFun());
现在,cons
返回一些函数,该函数接受一个函数作为参数并在记住的a
和b
上执行该函数。接下来,您传递闭包函数car
函数,而car
函数通过传递另一个接受a
和b
但仅返回{{1 }}。
同样,b
函数也可以处理cdr