gpt4 book ai didi

javascript - 将函数作为不带参数的回调传递 - 需要帮助来理解它

转载 作者:行者123 更新时间:2023-12-01 15:16:25 24 4
gpt4 key购买 nike

我在一些教程中看到过这样的代码示例:

getSomething(function onSomething(name) {
return renderSomething(name);
});
它等于以下内容:
getSomething(renderSomething);
我是新手,以前从未见过这样的事情。我真的无法理解上述内容如何相同( renderSomething() 上没有参数)。
我试图重新创建类似于上述代码的内容以更好地理解它并且有点失败。我正在向您展示我尝试过的内容,希望您能向我解释为什么上面的内容是等价的以及出现的以下两个问题。
你能向我解释一下吗:
  • 为什么参数name是未定义的?
  • console.log('a') 怎么来的?在 console.log('c') 之前打印?

  • var name = 'alex';
    console.log('start');

    function print(cb) {
    console.log('a');
    cb();
    }

    function renderName(name) {
    console.log('b');
    console.log(name);
    }

    print(function onPrint(name) {
    console.log('name: ', name);
    console.log('c');
    return renderName(name);
    });

    最佳答案

    要了解这两个语句是如何等效的,您确实需要查看函数内部,并首先思考我们为什么使用回调。理解函数声明( function getFullName )、调用( getFullName() )和引用( getFullName )之间的区别也很重要。
    我们使用回调来对稍后可能发生的事情使用react,通常我们感兴趣的任何事情的结果。因此,我们创建了接收该结果的回调。
    假设你有一个函数 getFullName ,如果它是同步的,你可以这样调用它:

    const fullName = getFullName('John', 'Doe');
    函数内部可能只是:
    function getFullName(firstName, lastName) {
    return firstName + ' ' + lastName;
    }
    但是由于某种原因,这个函数是异步的,所以你不会直接得到结果,所以我们使用回调来在名称准备好使用时得到通知:
    function getFullName(firstName, lastName, callback) {
    // Do something that takes time, then with the result of that
    callback(firstName + ' ' + lastName);
    }
    现在当我们调用这个函数时,它看起来像这样:
    getFullName('John', 'Doe', function (fullName) {
    console.log(fullName);
    });
    所以 getFullName函数,将调用我们的回调并将其创建的值传递给它。由于您的函数需要 1 个参数,因此无论我们如何命名该参数,fullName 都将在该参数中。因此,我们可以将回调(我们创建为匿名函数)替换为任何其他接受一个参数的函数,例如 console.log,如下所示:
    getFullName('John', 'Doe', console.log)
    在这两种情况下,我们都发送了对 getFullName 的函数引用。 ,在第一种情况下,它是我们刚刚创建的函数的引用,在第二种情况下,它是对全局范围内的函数的引用。
    你同样可以这样做:
    const myCallback = function(fullName) {
    console.log(fullName);
    }

    getFullName('John', 'Doe', myCallback);
    请注意这与执行以下操作有何不同:
    getFullName('John', 'Doe', myCallback()); <-- function invocation!
    在这里,因为我们正在调用/调用函数,它将执行,其结果将作为第三个参数传递给 getFullName ,这不是我们想要的。
    阅读一流的功能可能会给您更多的见解!
    正如其他人所提到的,但是为了完成,在您的示例中,您永远不会将某些结果传递给您的回调,在这种情况下,您可以传递变量 name或其他东西来模拟正在创建的结果。通过翻转调用 console.log 和 cb(name) 的顺序你的日志应该是有意义的。
    您从回调函数返回的内容将永远不会真正被使用,至少在我们的示例中不会。

    关于javascript - 将函数作为不带参数的回调传递 - 需要帮助来理解它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62959564/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com