这个javascript / Jquery代码的执行顺序是什么?

好的,我是jquery和Javascript的新手。 我正在阅读关于w3school的回调,它给出了两个例子。

例1:

$("button").click(function(){ $("p").hide("slow",function(){ alert("The paragraph is now hidden"); }); }); 

例2:

 $("button").click(function(){ $("p").hide(1000); alert("The paragraph is now hidden"); }); 

据我所知,在第一种情况下,只有在hide()函数完成后才会执行警报。 但是在第二个示例中,可能会在隐藏完成之前执行警报。 这在我的理解中造成了一些混乱。 例如,在下面的情况下, alert('hey')可能会在它之前的警报(具有数学计算的警报alert('hey')之前执行。

 $("button").click(function(){ alert(1+2+(3*4)..blah..blah); alert('hey'); }); 

或者在这种情况下……

 $("button").click(function(){ fn1(); fn2(); }); function fn1(){ for(var i=0;i<100;i++){ $('table').append(blah); } } function fn2(){ alert('hey'); } 

是否有可能在fn1完成追加之前出现“嘿”? 如果是这样,我需要写每个东西作为回调?

在Javascript中使用alertconfirm时,浏览器被强制进入同步(现有或同时发生)进程,其中所有内容(甚至是加载另一页)都会停止,直到用户解除对话框为止。

因此,当您发出警报时,浏览器将停止执行其他function。

但是jQuery hide和其他动画函数是异步的(不同时存在),因此浏览器将在不等待它们的情况下转到下一行。

对于前者

 $(document).ready(function(){ fn1(); fn2(); }); function fn1(){ for(var i=0;i<100;i++){ $('body').append("
blah
"); console.log("blah!"); } } function fn2(){ console.log("Hey!"); }

在浏览器等待f1()完成时,将在blah (100次)之后记录hey


DEMO


但如果你尝试类似的东西:

 $(document).ready(function(){ fn1(); fn2(); }); function fn1(){ for(var i=0;i<100;i++){ if(i%10==0) { fn2(); alert(true); } console.log("blah!"); } } function fn2(){ console.log("Hey!"); } 

然后alert将显示其工作方式。

在jQuery中:

 $("p").hide("slow",function(){ // This is the call back function and not others. }); 

当任何异步或同步function首先执行其任务时,将执行回调。

回答你的问题:不。

关键是某些javascript函数是异步的 。 这些实际上只有两个常见的类别:

  1. XmlHttpRequest(即AJAX)调用,浏览器进入网络以获取某些内容,并且它允许脚本在收集响应时继续运行。
  2. 超时和间隔,您告诉浏览器在延迟后调用一些代码。 脚本将继续畅通无阻,然后,当时间到来时,超时代码将运行。

在你的例子中:

 $("p").hide("slow",function(){ alert("The paragraph is now hidden"); }); 

jQuery中的hide函数是基于超时的。 因此,您的脚本不必等待动画完成才能开始其业务。 jQuery提供了一个回调参数,因此您可以根据需要选择在动画完成后发生某些事情。

所以在这个例子中:

 $("button").click(function(){ $("p").hide(1000); alert("The paragraph is now hidden"); }); 

在隐藏完成之前说“可能”执行警报是错误的。 除非您的代码执行速度太慢以至于要显示警报需要超过1整秒,否则它将在隐藏完成之前执行。 1000ms是一行javascript的永恒。

 $("button").click(function(){ alert(1+2+(3*4)..blah..blah); alert('hey'); }); 

在这个例子中,没有关于代码的异步。 alert是一个所谓的blocking调用,这意味着在您关闭警报之前,脚本中没有任何操作。 因此,您可以保证警报将按顺序显示,无论您制作参数的复杂程度如何。

事实上,参数的复杂性没有影响,因为它会在结果字符串传递给alert函数之前完全评估。

长话短说,除非您正在执行Ajax, setTimeoutsetInterval ,或者使用第三方库(应记录其行为),否则您的代码将按顺序执行。

在示例2中, alert()首先出现的原因是hide()调用是异步的。 hide()函数,但这有1000毫秒的延迟。 alert()之后立即触发,而不是之后1000毫秒,因此看起来alert()首先被触发。

在示例1中, alert()仅在hide()完成时触发,因为它使用回调函数。

不,这是不可能的,对于函数,JavaScript一行一行但是一次性完成,但它在给出第二个结果之后返回第一个的结果! 但是对于另一个例子,很明显hide()需要花费更长的时间来提供所请求的响应,而警报是一个内置于函数中的浏览器,这就是为什么警报在hide()之前出现的原因,我不知道做这些事情的确切时间,但如果你谷歌它,你也可以学习它们,如果你需要!

BTW当一个alert()弹出时,它会关闭整个javascript代码,只是为了让你知道。 ;)