Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

JavaScript:回调函数是如何工作的?

JavaScript:回调函数是如何工作的?,javascript,Javascript,我是JS新手,在编写/理解回调函数时遇到了很多困难 比如说,我有下面的代码,但我不想 takeNumbersGreaterThan(5); 执行至 insertNumbers(); 完成 numbers = []; greaterThan = []; insertNumbers(); takeNumbersGreaterThan(5); insertNumbers(){ for (var i = 0; i<11; i++) { numbers.push(i

我是JS新手,在编写/理解回调函数时遇到了很多困难 比如说,我有下面的代码,但我不想

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或网络代码吧。让我们看一个场景,让我们更清楚地了解使用回调的原因