Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我将函数抽象为命名函数时,为什么这个回调没有定义?_Javascript_Gulp - Fatal编程技术网

Javascript 当我将函数抽象为命名函数时,为什么这个回调没有定义?

Javascript 当我将函数抽象为命名函数时,为什么这个回调没有定义?,javascript,gulp,Javascript,Gulp,我试图理解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

我试图理解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();
  });
};
问题是带有命名函数的代码不起作用。我得到一个
referenceError:cb没有为
deleteFolder(cfg.path.dist,cb)定义
。这是有道理的,因为事实并非如此。但在工作示例中也没有定义它。那么为什么它在那里起作用呢

当你这样做的时候

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

您没有传递
gulp.task
回调。您正在调用函数
deleteFolder
,并传递其返回值。由于它不返回任何内容,因此该函数的返回值为
undefined
。因此,您会看到错误。

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

可以使用函数名引用函数,而不使用参数,例如
deleteFolder
。如果添加括号,则当该代码位最初运行时,将对其进行计算,并将该函数的返回值传递给
任务
函数,而不是传递函数本身

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

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

此外,不能在参数中定义“doneDeleting”之类的函数。您需要在中单独定义并通过引用传递它(如上所述)。但是,当您从它内部调用
cb()
时(只有在触发回调时才会传入),您需要将
doneDeleting
函数作为匿名函数传递,而不是命名并通过引用传递它,as
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();
  });
};
我一直想知道你怎么知道一个回调函数会传递多少个参数。答案是纯粹的文档记录,或者如果没有文档记录,则尝试错误/拖网代码。基本上,回调函数的参数不是由您决定的

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


您最好更详细地了解一下回调函数是什么,这是一个很好的起点(它在AJAX请求结束时使用回调)。

gulp.task的回调函数只接受一个参数。因此,您正在使用的命名函数将只有一个参数

正确的版本如下:

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 doneDeleting(err) {
    if (err) return cb(err);
    cb();
  });
};

@109830487515325为什么-1?我想知道我做错了什么对不起,我没有投你一票。不知道你为什么被否决。。虽然我可以看到您移动了我的
cfg.path.dist
变量,这使得函数变得毫无意义。我将其抽象为函数的唯一原因是,我希望目标是可变的,而您将目标设置为静态的。这可能就是为什么…而且,我已经测试过了,但它不起作用。仍然返回
deleteFolder(cb)
中未定义的
cb
。所以也可能是这样。但是我同意没有评论的向下投票是不好的。了解我做错了什么,更新了答案你是说gulp.task将
cfg.path.dist
对象视为回调函数?如果我只是切换它们,它会工作吗?@109830487515325不,
gulp.task
查看它的第二个参数,并期望它是一个函数。在您的情况下,它不是一个函数,您正在那里调用一个函数,这意味着函数的返回值将是
gulp.task
Ah ok所看到的东西。现在我明白了,凯萨迪塔的答案不起作用。但是,如果我只传递不带括号的函数(但是我不能传递自己的任何参数),那么使用命名函数是可行的。我不明白的是,当我使用括号并显式声明
cb
参数时,为什么向它传递一个匿名函数会起作用。有什么区别?我所能看到的唯一区别是名字。@109830487515325抱歉,我误读了凯尔萨迪塔的答案。我已经在我的回答中重写了您需要如何做。我发现,当我使用匿名函数包装
deleteFolder
,然后将回调传递到
deleteFolder
时,它确实起作用。这允许我仍然使用deleteFolder。但我仍然不明白的是,为什么我必须用匿名函数指定
cb
参数,而不是用命名函数?因为回调总是在
task
函数(gulp代码中的某个地方)内传递1个参数。我们已经定义了
deleteFolder
只接受1个参数(为了匹配1个参数,我们发现gulp会给出它)。如果我们允许
deleteFolder
接受两个参数,gulp的
task
函数仍然只会传递一个参数。我知道
d的工作原理是这样的