Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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

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

Javascript事件驱动系统中异步性背后的原因是什么

Javascript事件驱动系统中异步性背后的原因是什么,javascript,asynchronous,callback,event-driven,Javascript,Asynchronous,Callback,Event Driven,请帮助我理解这一点 您有一个调用几个方法的函数: function() { methodA(function(){...}); methodB(); methodC(); } 从没有回调或匿名函数的语言中,我习惯了这样一个事实,即直到方法返回,执行才会继续 因此,如果我使用回调调用methodA,那么执行将不得不等到方法返回时,这不是异步的,对吗 因此,例如,我可以存储对某个对象的回调,并让methodA返回。然后执行methodB和methodC。当用户单击按钮时,某个处理

请帮助我理解这一点

您有一个调用几个方法的函数:

function() {
   methodA(function(){...});
   methodB();
   methodC();
}
从没有回调或匿名函数的语言中,我习惯了这样一个事实,即直到方法返回,执行才会继续

因此,如果我使用回调调用methodA,那么执行将不得不等到方法返回时,这不是异步的,对吗

因此,例如,我可以存储对某个对象的回调,并让methodA返回。然后执行methodB和methodC。当用户单击按钮时,某个处理程序执行回调

我得出的结论是,与java或python相比,javascript并没有异步性(不涉及多线程)。。。。因为在java中,回调不是闭包/匿名方法,而是一个带有“execute”方法的对象,它将完全相同,只是稍微复杂一点。。。当然,有一个特定于DOM的JS事件系统

function main() {
   methodA(function callback(){...});
   methodB();
   methodC();
}
假设回调没有立即执行

执行命令:

  • 方法
  • 方法B
  • 方法C
  • 。。。其他东西,直到堆栈为空
  • 回拨

    • JavaScript中的回调不会隐式添加异步行为。当调用回调函数时,它会立即运行,就像普通函数一样。(实际上,回调函数只是一个普通函数…)

      因此,无法确定本例中回调的执行何时将与其他方法相关联地运行(除了调用
      methodA
      之前不能运行之外)——可以从
      methodA
      methodB
      或稍后单击调用,也可以根本不调用。(但是,除非存在异常——或者其中一个函数调用了另一个函数——否则
      methodA
      将在
      methodB
      之前运行,而
      methodC
      将在
      methodC
      之前运行;如果
      methodA
      引发异常,则不会调用
      methodB
      methodC

      添加异步行为的是异步事件源,如计时器事件或UI操作,如按钮单击

      但是,重要的是要记住,Javascript没有或不支持线程。在触发新的异步事件之前,Javascript必须“停止”(执行必须从异步事件源调用的回调函数返回)。(异步事件(视情况而定)排队,以便在另一个回调执行时间过长时不会“丢失”计时器事件。)

      这就是为什么
      while(true){}
      将使浏览器页面冻结并阻止处理按钮事件处理程序的原因

      快乐编码


      示例案例():

      函数invokeNow(回调){
      //这里没发生什么事。
      //此时将调用回调并返回结果。
      返回回调()
      }
      警报(invokeNow(函数(){return“Hello world!”}))
      函数doLater(回调){
      //设置异步事件
      设置超时(回调,1000)
      return“现在还不是‘晚’!”
      }
      警报(数据记录器(功能)(){
      警报(“稍后!”)
      //请注意,这是在上一个函数的回调中运行的
      //计时器事件。如果此代码低于外部警报,则
      //它不会允许第一次计时器回调发生
      //直到阻塞完成
      警报(doLater(函数(){alert(“我仍然在运行!”)}))
      变量结束=(+新日期)+4000
      而((+新日期)


      警告:Firefox4(4.0.1)和上面的代码似乎有问题。虽然其工作原理如所示,但如果超时时间低于约800毫秒,则预期顺序与实际顺序不同。我已经发布了,希望会有一些解决方案。该行为在Firefox 3、IE 9和Chrome 11中正常工作。

      Javascript是连续的,除非您使用
      setInterval
      setTimeout
      ,或者通过回调或使用
      onload向服务器发出请求。我不确定还有其他情况

      如果您有以下情况:

      function methodA(fn){
        ...
        fn();
      }
      

      然后,当您调用
      methodA(function(){…})

      时,将调用回调。这不是真的。methodA可以立即调用传递给它的函数。请指定堆栈包含什么?你是说堆栈只在函数范围内?当函数返回或结束时调用回调?或者即使在函数返回后也可以执行回调?@Edgar堆栈包含main之后执行的任何内容,直到没有更少的内容可执行为止。这只是一种可能性,最有可能的情况是,但除非我们知道
      methodB
      methodC
      做什么,否则无法保证顺序。回调可以放入全局范围,然后通过
      methodB
      methodC
      执行。
      function methodA(fn){
        ...
        fn();
      }