从 C# 角度看 JavaScript 回调基础知识

问题描述 投票:0回答:1

请帮助我理解有关回调的两件事。它们是留给我的最后一个 JS 怪异,我无法掌握强大的 C# 背景。

首先 - 为什么我们应该将函数作为参数发送。我知道我们可以,但为什么呢?我将尝试我能想到的最简单的例子。所以根据 JS 开发者的说法,它应该是这样的:

function simpleCallbackFn (){}

function simpleCallerFn (cb){ cb();}

simpleCallerFn (simpleCallbackFn);

为什么不这样:

function simpleCallbackFn (){} // Same as before

function simpleCallerFn (){ simpleCallbackFn ();}  

我们不传递回调,我们只是从调用者内部调用它。它在完全可见的范围内。然后我们只需进行初步通话即可。

simpleCallerFn ();

从调用者函数中调用“回调”函数应该完全没问题并达到相同的结果。

第二 - 说我需要使用带参数的回调

function simpleCallbackFn (anArgument){}

function simpleCallerFn (cb){ 
   cb(anArgument);
}

我们知道这行不通

simpleCallerFn (simpleCallbackFn(anArgument));

根据 JS 开发者的说法,应该是这样的:

simpleCallerFn (() => simpleCallbackFn(anArgument));

我在想为什么不:

function simpleCallbackFn (anArgument){}

function simpleCallerFn (anArgument, cb){ 
   cb(anArgument);
}

然后像这样进行初始调用:

simpleCallerFn (anArgument, simpleCallbackFn);

请。 Javascript 让我感觉就像在怪胎马戏团里一样。

谢谢你。

javascript callback arguments
1个回答
0
投票

为什么不这样:

function simpleCallbackFn (){} // Same as before

function simpleCallerFn (){ simpleCallbackFn ();}  

这当然是合法的代码,但只有在您提前确切知道要执行哪些代码的情况下才有可能。回调函数的要点是您可以在运行时决定要做什么。

例如,数组有一个名为

map
的内置函数。它接受一个数组并将其转换为新数组。您传入一个回调函数,指定如何进行转换,
map
将为数组的每个元素调用您的函数。代码无法提前知道您想要执行什么转换,因此回调函数就是您指定的方式。

const values = [1, 2, 3];
const doubled = values.map(val => val * 2);

我在想为什么不: 函数 simpleCallbackFn (anArgument){}

function simpleCallerFn (anArgument, cb){ 
  cb(anArgument);
}

如果您确定调用者希望将一个参数传递给函数,那么这种方法就有效。但如果他们需要两个或更多,那就不行了。如果他们需要 0 这会让事情变得更加麻烦,因为他们必须明确告诉你将

undefined
传递给回调。

因此,让调用者创建一个执行他们想要的功能的函数的好处是,他们可以根据他们可以想象的任何要求来创建any函数。

© www.soinside.com 2019 - 2024. All rights reserved.