【问题标题】:Passing function as parameter and calling it javascript将函数作为参数传递并调用它 javascript
【发布时间】:2019-08-08 14:21:36
【问题描述】:

我遇到了一个如下的 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

【问题讨论】:

标签: javascript function ecmascript-6


【解决方案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 上,我不习惯将参数传递给未定义的任何东西,例如 func(a, b),但很高兴知道我可以。在 2 上,我明白了……我只是传递了一个带有参数 a 和 b 的回调,并将 a 或 b 作为 func 返回。现在有道理了。非常感谢!
【解决方案2】:

简单来说,这一切都是因为closure!您正在调用一个函数cons,该函数在内部返回另一个函数定义,该函数定义在内部引用属性ab,它们在cons [父] 函数的范围内。

要添加更多的灯光,让我们做一些简单的更改,你可以看到它,

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 但只返回b 的回调来触发该函数。

同样,cdr 函数对 b 起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多