JavaScript:回调函数是如何工作的?
我是JS新手,在编写/理解回调函数时遇到了很多困难 比如说,我有下面的代码,但我不想JavaScript:回调函数是如何工作的?,javascript,Javascript,我是JS新手,在编写/理解回调函数时遇到了很多困难 比如说,我有下面的代码,但我不想 takeNumbersGreaterThan(5); 执行至 insertNumbers(); 完成 numbers = []; greaterThan = []; insertNumbers(); takeNumbersGreaterThan(5); insertNumbers(){ for (var i = 0; i<11; i++) { numbers.push(i
takeNumbersGreaterThan(5);
执行至
insertNumbers();
完成
numbers = [];
greaterThan = [];
insertNumbers();
takeNumbersGreaterThan(5);
insertNumbers(){
for (var i = 0; i<11; i++)
{
numbers.push(i)
}
}
takeNumbersGreaterThan(number){
for (var m = 0; m<numbers.length; m++)
{
if (numbers[m] > number)
{
greaterThan.push(numbers[m])
}
}
}
number=[];
大于=[];
插入数字();
服用次数大于(5);
insertNumbers(){
对于(var i=0;i,如果我理解正确,您希望了解有关回调的更多信息,并希望使用回调。让我尝试帮助您使用代码
如果要在insertNumbers();
之后立即使用回调函数执行takenumbersgreater(5);
,可以执行以下操作:
numbers = [];
greaterThan = [];
insertNumbers(takeNumbersGreaterThan, 5);
function insertNumbers(callbackFunction, callbackFunctionParam){
for (var i = 0; i<11; i++)
{
numbers.push(i)
}
callbackFunction(callbackFunctionParam);
}
function takeNumbersGreaterThan(number){
for (var m = 0; m<numbers.length; m++)
{
if (numbers[m] > number)
{
greaterThan.push(numbers[m])
}
}
}
number=[];
大于=[];
插入数字(取大于5的数字);
函数insertNumbers(callbackFunction、callbackFunctionParam){
对于(var i=0;i您已经在那里了。您的代码几乎完全正确。
您只是缺少函数keywork声明
下面的脚本向您展示了如何在插入数字之后运行TakeNumbers。在我的示例中,我还更改了函数符号,以便将数组作为参数传递,并避免一些常见的“错误”,即闭包
var number=[];
风险值大于=[];
var insertNumbers=函数(数字){
对于(var i=0;i您的代码不使用任何异步调用,因此您不需要使用任何回调来处理执行。但是,如果您想知道如何执行,这将是一种方法
numbers = [];
greaterThan = [];
function insertNumbers(callback){
for (var i = 0; i<11; i++)
{
numbers.push(i)
}
callback(); // now execute the callback funtion
}
function takeNumbersGreaterThan(number){
for (var m = 0; m<numbers.length; m++)
{
if (numbers[m] > number)
{
greaterThan.push(numbers[m]);
}
}
console.log(greaterThan);
}
insertNumbers(function() { // here we send a functions as argument to insertNumbers which will execute when callback() is called
takeNumbersGreaterThan(5);
});
number=[];
大于=[];
函数insertNumbers(回调){
for(var i=0;i代码(大部分)是按顺序执行的。在您提供的代码中,计算机按照您提供的顺序运行代码。首先,它创建一个新的数组对象并将其设置为numbers变量,然后创建一个新的数组对象并将其设置为greaterThan变量。
然后,它运行insertNumbers函数。现在计算机所做的是跳转到您在insertNumbers中定义的代码并执行所有代码。然后,在完成之后,它将返回到执行其上的初始代码线程,该线程位于第4行。因此,现在它将跳转到TakeNumbersGreater代码。因此,从功能上讲,y您不需要任何回调,因为您的代码不会执行任何需要任意时间的操作
经过解释,您可以看到TakeNumberSgreateThan在执行insertNumbers之后才会执行
代码没有按顺序执行的唯一时间是开始执行多核/线程代码时
回调在某些事情需要任意时间时使用,例如从磁盘读取数据或从网络请求数据时
回调可以存在,因为javascript(和许多其他语言)中定义了函数在代码中作为对象存在。如果不在函数名后加括号,实际上就像引用任何其他变量一样引用函数对象。因此,您可以在代码中传递该函数对象并将其传递给其他代码位。这就是本例中发生的情况
setTimeout(myCallback, 5000)
function myCallback(){
console.log("5 seconds have passed");
}
因此,如您所见,我可以将我的函数myCallback
交给另一个函数,在本例中是setTimeout
,在另一个函数完成任务后使用。基础知识(不是关于回调,而是关于编程语言)
要理解回调,首先要理解函数。要理解javascript中的函数,首先要理解变量、值和函数
几乎所有的编程语言都可以处理值。因此,如果你做过任何编程,你都会对值有一个基本的概念(我将在这里大大简化值的类型,并将值和引用/指针都称为“值”)
值是一种东西。例如一个数字或一个字符串。因此22.31
是一个值,“Hello Dave”
是一个值
大多数语言也有变量的概念(但并非所有语言都有)。变量是我们赋予值的“名称”,以便于处理值。例如,在下面的示例中,x
是一个变量:
var x = 12;
function a () {return "Hello"}
var y = a;
…它的值是12
变量允许我们做什么?它允许我们在计算中用一个值替换一个名称。就像数学一样。例如,如果x
是12
,我们知道可以将1
添加到12
中,我们还可以做:
x + 1
函数是值
在javascript中,函数是值。例如,在下面的示例中,我们将函数分配给变量:
var x = 12;
function a () {return "Hello"}
var y = a;
由于变量的作用是允许您用名称替换值,因此如果您可以使用语法a()
调用函数a
,这意味着您也可以使用变量y
:
y(); // returns "Hello"
回调
如果函数是值,这也意味着您可以将函数作为参数传递给其他函数。例如,以下是您通常在另一个函数中调用函数的方式:
function a () {return "Hello"}
function b () {return a() + " World"}
b(); // returns "Hello World"
如果可以将函数作为变量传递,则意味着您可以执行以下操作:
function a () {return "Hello"}
function b () {return "Bye"}
function c (functionVariable) {return functionVariable() + " World"}
c(a); // returns "Hello World"
c(b); // returns "Bye World"
while (1) {
if (button.isClicked) {
doSomething();
}
}
如您所见,回调一点也不特殊。它们只是javascript函数遵守与数字、数组和字符串等其他值相同的规则的结果
回调并不意味着异步
从上面的示例中可以看到,对函数c
的两个调用都返回一个值。因此,函数c
即使接受回调,也不是异步的。因此回调可用于同步和异步代码
同步回调的一个很好的例子是Array.sort()
方法。它对数组进行排序,但接受一个可选回调,供您定义如何排序(按字母顺序、数字顺序、按姓氏等)
为什么异步代码需要回调
现在,先忘掉ajax或网络代码吧。让我们看一个场景,让我们更清楚地了解使用回调的原因