gpt4 book ai didi

javascript - 当我将函数抽象为命名函数时,为什么此回调未定义?

转载 作者:行者123 更新时间:2023-12-02 16:59:38 25 4
gpt4 key购买 nike

我正在尝试理解 JavaScript 回调的概念,并且正在更改这段使用回调的(工作)代码:

/* Working */

var gulp = require('gulp'),
del = require('del');

var cfg = require(process.cwd() + '/config.json');

gulp.task('del:dist', function(cb) {
del([cfg.path.dist], function(err) {
if (err) return cb(err);
cb();
});
});

使用命名函数的代码,以便我可以更好地理解发生了什么:

/* Not working */

var gulp = require('gulp'),
del = require('del');

var cfg = require(process.cwd() + '/config.json');

gulp.task('del:dist', deleteFolder(cfg.path.dist, cb));

function deleteFolder(targetFolder, cb) {
del(targetFolder, function doneDeleting(err) {
if (err) return cb(err);
cb();
});
};

问题是带有命名函数的代码不起作用。我收到 deleteFolder(cfg.path.dist, cb));referenceError: cb is not Defined 。这是有道理的,因为事实并非如此。但它在工作示例中也没有定义。那么为什么它在那里起作用呢?

最佳答案

回调通常采用函数引用或匿名函数作为其参数。执行回调的函数确定提供给该函数的参数。

可以使用不带参数的函数名称来引用函数,例如删除文件夹。如果添加括号,那么当该代码最初运行时,它将被求值,并且该函数的返回值将被传递给 task 函数,而不是传递函数本身。

如果您只是在不带括号的情况下传递了 deleteFolder ,它会回调您的函数,传入 targetFolder 作为其唯一的参数(cb 将在你的函数内为空)。 “targetFolder”变量将包含您希望在 cb 中找到的内容。

task 函数传递给任何回调函数的唯一值是一个参数(此处标记为 cb)。

此外,您不能在参数内定义诸如“doneDeleting”之类的函数。您需要单独定义并通过引用传递它(如上所述)。但是,当您从其中调用 cb() (并且仅在回调被触发时才会传递)时,您将需要将 doneDeleting 函数传递为一个匿名函数,而不是命名它并通过引用传递它,因为 cb 不会位于定义函数的范围内。

根据您的情况,以下内容将起作用:

var gulp = require('gulp'),
del = require('del');

var cfg = require(process.cwd() + '/config.json');

gulp.task('del:dist', deleteFolder);

function deleteFolder(cb) {
del([cfg.path.dist], function(err) {
if (err) return cb(err);
cb();
});
};

我一直想知道你应该如何知道回调函数将传递多少个参数。答案是纯粹的文档,或者失败的话,尝试和错误/拖网代码。基本上,回调函数的参数不取决于您!

这样想吧。通常,回调的目的是在函数运行后使用该函数生成的一些新数据执行某些操作。函数完成后,我们想对这些数据做一些事情。我们获取数据的方式是传递创建数据的函数,将其传递给我们的参数,然后我们可以在其中对其进行操作。如果我们传入自己的参数,那么我们可能永远无法访问函数生成的数据。

如果您能更详细地了解一下回调函数是什么,那会很有帮助 - here是一个很好的起点(它在 AJAX 请求结束时使用回调)。

关于javascript - 当我将函数抽象为命名函数时,为什么此回调未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25866456/

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