Javascript 函数参数是如何隐式初始化的?

Javascript 函数参数是如何隐式初始化的?,javascript,node.js,Javascript,Node.js,我试图了解图像和图像数据是如何填充的。它们没有在任何地方申报。父函数如何知道传递给这两个参数的值 var Jimp = require("jimp"); module.exports = function (context, myBlob) { Jimp.read(myBlob, function(err, image) { image.getBuffer(Jimp.MIME_TIFF, function(error, imageData) { c

我试图了解图像和图像数据是如何填充的。它们没有在任何地方申报。父函数如何知道传递给这两个参数的值

var Jimp = require("jimp");
module.exports = function (context, myBlob) {
    Jimp.read(myBlob, function(err, image) {
        image.getBuffer(Jimp.MIME_TIFF, function(error, imageData) {
            context.bindings.outputBlob = imageData;
            context.done();
        });
    });
};

它不是填充这些函数的父函数

image由Jimp.read填充&imageData由image.getBuffer填充


传递给Jimp.read&image.getBuffer的函数称为回调函数

您在read和getBuffer两种情况下都提供了回调函数作为第二个参数。当这些函数完成它们的工作时,它们调用回调函数,将数据作为第二个参数传递,如果第一个参数没有数据,则返回一个错误或null。因此,该值可用并填充在回调函数体中。

它们作为参数传递。把他们想象成

    function read(err, image_function) {
       let imageData = // do whatever to read some imageData from hard drive
       image_function(imageData);
    }

    function getBuffer(mimeType, callback_function) {
       // do whatever
       callback_function();
    }




因为getBuffer需要一个带有特定签名的回调,它使用它决定使用的任何函数调用该回调。image.getBuffer始终传递相同的参数。更改回调函数的签名不会改变这一点。其工作方式与此相同:函数runinput,runthis{runthisinput;}runtest,console.log;。Jimp.read等的设计是,它们通过调用为此目的指定的函数来发送值,而不是返回值。这就是所谓的回调模式,你应该能够找到很多不错的教程来解释它是如何工作的——很多节点库很大程度上依赖于你对它的理解,所以我强烈建议你阅读一下它。实际上,它们主要是通过承诺来工作的。我建议你也这样做。使用回调是可以的,但您必须小心不要陷入困境。如果Jimp.read实际上依赖于图像,那么Jimp.read如何填充图像?您的回答与上面@Paflow所说的相矛盾,其中Jimp.read填充imageDataJimp.read不依赖于图像。它由一个匿名函数调用,该函数具有一个参数映像。在这个函数中,我在上面的解释尝试中称之为image_函数,paremater可以像往常一样使用,并在调用匿名函数时由Jimp.read填充。这与@Oxi下面的建议相矛盾。你能看一下吗?