Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.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_Node.js_Reactjs_Angularjs_Express - Fatal编程技术网

javascript中的异步和回调

javascript中的异步和回调,javascript,node.js,reactjs,angularjs,express,Javascript,Node.js,Reactjs,Angularjs,Express,我对这种JavaScript语言和堆栈溢出也是新手。我看了很多关于同步的视频和博客,异步和回调,但我不能确定的是,如果同步意味着代码应该按顺序进行,代码的每一步都应该等待前一步,异步意味着我们不必等待任何东西,那么当涉及回调函数时。例如,我们必须从数据库中提取一些数据假设我们制作了一个程序,其中我们将一个函数作为回调函数传递,在获取数据后,这个回调函数将启动。因此,在这种情况下,回调也必须等待完成任务,直到整个数据加载完毕。那么,这件事怎么可能是异步的,而不是同步的,因为在异步的 例如: //

我对这种JavaScript语言和堆栈溢出也是新手。我看了很多关于同步的视频和博客,异步和回调,但我不能确定的是,如果同步意味着代码应该按顺序进行,代码的每一步都应该等待前一步,异步意味着我们不必等待任何东西,那么当涉及回调函数时。例如,我们必须从数据库中提取一些数据假设我们制作了一个程序,其中我们将一个函数作为回调函数传递,在获取数据后,这个回调函数将启动。因此,在这种情况下,回调也必须等待完成任务,直到整个数据加载完毕。那么,这件事怎么可能是异步的,而不是同步的,因为在异步的

例如:

// Callback Function Example
function greet(name, myFunction) {
console.log('Hello world');

  // callback function
  // executed only after the greet() is executed
   myFunction(name);
}

}

在本例中,假设“hello world”来自后端。因此,对于这个hello world,数据回调必须等待,因为有时候等待下一步很重要,但接下来的疑问是,这个东西怎么可能是异步的,因为回调函数必须等待其他函数完成它的任务。
注:由于声誉问题,我无法发布示例图片

您误解了等待不会发生在哪里

鉴于:

someImage.addEventListener("load", someFunction);
console.log("This is logged");
first行将
someFunction
设置为一个回调,在加载图像时将调用该回调

JS引擎然后立即运行第二行,而不等待加载映像和调用回调


稍后,将加载映像,然后触发回调。这将是
console.log
语句记录字符串之后的某个时间(因为JS引擎在继续执行
console.log
语句之前没有等待)。

好问题,不是因为您对同步或异步感到困惑,但更重要的是,你的创造性思维试图理解引擎盖下的边缘案例。在我看来,这是件好事

你被告知或可能阅读或观看过的内容在哪里

JavaScript是一种脚本语言。您键入一些东西,它会解释它,并执行您要求它执行的任何操作

Javascript是一种单线程语言。这意味着它有一个调用堆栈和一个内存堆,并按顺序执行代码(我们将在下一节中讨论),并且必须在进入下一节之前完成一段代码的执行

Javascript以自上而下的顺序运行。这意味着当我们给它代码时,让我们在解释之前调用它的入口点。一旦进入口译阶段,它就不会回到起点。然后,一旦完成解释,它将收集您拥有的代码片段、代码要求执行的操作,将整个块移动到内存中,并开始逐行执行。一旦进入执行模式,它将不会返回到解释

让我们看看下面的例子,我们有JS引擎的一些代码,也就是入口点,它解释了它,然后执行了它。问题是为什么它没有抛出错误,console.log在声明之前是如何知道abc()的

这称为堆。Javascript引擎为我们做了大量工作。但是最重要的事情是阅读我们的代码并执行它。这一步骤中的两个重要事项是: 我们需要一个地方来存储和写入信息-我们应用程序的数据(变量、对象等) 我们需要逐行跟踪代码发生了什么

这就是调用堆栈和内存堆的所在。调用堆栈是abc()在声明之前出现的地方。解释器将其放入堆(又名内存)并重新生成堆栈,因为函数是第一类的(所以我们称它们为)它们得到vip处理并被直接推到顶部,在调用堆栈中定义它们的位置实际上并不重要,它们在内存中得到前排座位。当这种情况发生时,下面的所有内容都会自动知道上面的内容

console.log(abc());
函数abc(){
return“即使在声明函数之前调用了该函数,我仍然工作”;

}
我建议您展示一个具体的真实代码示例,而不是一个假设的示例。很难准确理解您询问的是什么代码。如果您展示了您所询问的真实代码,那么这里关于代码的问题总是能得到更快更好的答案。理论问题很难回答,也很难准确理解你在问什么。
  // calling the function after 2 seconds
  setTimeout(greet, 2000, 'John', sayName);
someImage.addEventListener("load", someFunction);
console.log("This is logged");