将函数作为参数传递并调用javascript

时间:2019-03-18 08:53:43

标签: javascript function ecmascript-6

我遇到了如下的javascript代码示例,尚不清楚其工作方式。我习惯于将函数作为回调传递,但我似乎无法理解

  1. 变量func可以接受参数(a,b)和
  2. 为什么函数对将以这种方式调用。

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

2 个答案:

答案 0 :(得分:1)

变量func带有参数ab,因为它们是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 [父]函数范围内的属性bcons。 / 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返回一些函数,该函数接受一个函数作为参数并在记住的ab上执行该函数。接下来,您传递闭包函数car函数,而car函数通过传递另一个接受ab但仅返回{{1 }}。

同样,b函数也可以处理cdr