为什么Javascript中的函数是同步的?

为什么Javascript中的函数是同步的?,javascript,node.js,Javascript,Node.js,myfunc是否应该在节点中执行并花费更长的时间,以便更早调用end,因为javascript是异步的?javascript具有异步操作。但是,for循环是同步的,而不是异步的。您显示的代码不使用任何异步操作,因此都是同步的 myfunc是否应该在节点中执行并花费更长的时间,以便更早地调用end,因为javascript是异步的 否。myfunc中没有异步的内容。在你的问题中,这些都是同步代码 setTimeout、http.get或fs.readFile等操作都是异步操作。它们不会改变for循

myfunc是否应该在节点中执行并花费更长的时间,以便更早调用end,因为javascript是异步的?

javascript具有异步操作。但是,for循环是同步的,而不是异步的。您显示的代码不使用任何异步操作,因此都是同步的

myfunc是否应该在节点中执行并花费更长的时间,以便更早地调用end,因为javascript是异步的

否。myfunc中没有异步的内容。在你的问题中,这些都是同步代码

setTimeout、http.get或fs.readFile等操作都是异步操作。它们不会改变for循环同步运行的事实,但是对可能放入循环中的任何异步的响应都将在console.logend运行之后发生

如果您这样做:

start
this should be the end
end
这是操作的顺序:

输出控制台.logstart 调用myfunc 运行for循环,启动10个setTimeout异步操作 完成for循环和输出console.log这应该是结束 myfunc返回 输出控制台.logend 一段时间后,第一个计时器完成并调用其回调,并输出计时器0 done now。 其余的计时器都结束了 for循环同步运行并启动所有计时器,然后myfunc返回。 正如jfriend所指出的,您的代码完全是同步的。下面是非常非常粗略的情况:

log'start'被添加到调用堆栈中-它激发然后退出调用堆栈,您将看到提供的消息 myFunc被添加到调用堆栈中,注意JavaScript是后进先出 在myFunc执行上下文中,您有一个迭代的for循环——尽管它没有显式地做任何事情,但它隐式地做各种事情,包括变量赋值、比较和增量——所有这些都是一个接一个地发生的同步行为 循环完成后,console.log“this should to the end”被添加到仍在myFunc执行上下文中的调用堆栈中,并记录到控制台,然后退出调用堆栈 接下来,myFunc退出调用堆栈 最后,console.log'end'进入调用堆栈,激发,然后退出调用堆栈
如果您想看到异步行为的实际应用,可以使用一些API。例如,setTimeout、setInterval、I/O操作、承诺和异步/等待。

否,为什么要这样做?JavaScript是同步的。JavaScript不是异步的,你从哪里得到这些信息的?@David你这里的是一个同步for循环,意味着myfunc将在循环完成后返回。为了让它以您期望的方式运行,您需要显式地使用Promissions/async/await ie在异步函数中运行循环JavaScript代码始终是同步的。但是一些底层功能,如网络和磁盘I/O是异步的,以避免阻塞其他代码。JavaScript在这方面并不特别,它与C、C++、java完全一样。唯一的例外是javascript没有或强烈反对同步I/O@DavidJavaScript和Python在I/O操作方面有很大的不同,如果在该函数中放入HTTP请求呢?HTTP请求将是异步的,但for循环仍然是同步的-它不会调度执行HTTP请求,直到所有javascript执行结束并到达脚本末尾,然后解释器将注意到没有其他要执行的内容,并将生成HTTP请求requests@David-我在回答中加了一个例子。
start
this should be the end
end
console.log("start")
myfunc()
console.log("end")

function myfunc(){
  for(let i=0; i<10; i++){
      setTimeout(function() {
          console.log(`timer ${i} done now`);
      }, 100);
  }
  console.log("this should be the end")
}
start
this should be the end
end
timer 0 done now
timer 1 done now
timer 2 done now
....