网络编程
位置:首页>> 网络编程>> JavaScript>> JavaScript程序执行顺序问题总结(2)

JavaScript程序执行顺序问题总结(2)

作者:oncoding 来源:oncoding blog 发布时间:2010-01-29 13:06:00 

标签:程序,顺序,JavaScript

5. body的onload函数与body内部函数的执行

body内部的函数会先于onload的函数执行,测试代码:

//html head...<script type="text/javascript">function fnOnLoad(){alert("I am outside the Wall!");}</script><body onload="fnOnLoad();"><script type="text/javascript">alert("I am inside the Wall..");</script></body>//先弹出“I am inside the Wall..”;//后弹出“I am outside the Wall!”

body的onload事件触发条件是body内容加载完成,而body中的js代码会在这一事件触发之前运行(为什么呢?6告诉你..)

6. JavaScript是多线程or单线程?

严格来说,JavaScript是没有多线程概念的,所有的程序都是“单线程”依次执行的。

举个不太恰当的例子:

function fn1(){var sum = 0;for(var ind=0; ind<1000; ind++) {sum += ind;}alert("答案是"+sum);}function fn2(){alert("早知道了,我就是不说");}fn1();fn2();//先弹出:“答案是499500”,//后弹出:“早知道了,我就是不说”

那你肯定要问:那延时执行、Ajax异步加载,不是多线程的吗?没错,下面这样的程序确实看起来像“多线程”:

function fn1(){setTimeout(function(){alert("我先调用")},1000);}function fn2(){alert("我后调用");}fn1();fn2();// 先弹出:“我后调用”,// 1秒后弹出:“我先调用”

看上去,fn2()和延时程序是分两个过程再走,但其实,这是JavaScript中的“回调”机制在起作用,类似于操作系统中的“中断和响应” —— 延时程序设置一个“中断”,然后执行fn2(),待1000毫秒时间到后,再回调执行fn1()。

同样,5中body的onload事件调用的函数,也是利用了回调机制——body加载完成之后,回调执行fnOnLoad()函数。

Ajax请求中的数据处理函数也是一样的道理。

关于JavaScript线程问题的更深入讨论,看这篇 javascript中的线程之我见,以及infoQ上的 JavaScript多线程编程简介

困了,再说一下回调函数吧。

7. 回调函数

回调函数是干嘛用的?就是回调执行的函数嘛,又废话:D

如6所说,最常见的回调就是onclick、onmouseover、onmousedown、onload等等浏览器事件的调用函数;还有Ajax异步请求数据的处理函数;setTimeOut延时执行、setInterval循环执行的函数等。

干脆我们写一个纯粹的回调函数玩:

function onBack(num){alert("姗姗我来迟了");// 执行num个耳光}function dating(hours, callBack){var SP= 0; // SP,愤怒值//女猪脚在雪里站了hours个钟头//循环开始..SP ++;//循环结束...callBack(SP);}dating(1, onBack);

dating运行完之后再执行回调函数onBack —— 约会结束了,暴风骤雨开始了。

今天先写到这里,一些更深入的东西还有待整理,更多的东西还需要继续学习,欢迎批改补充,欢迎指点迷津。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com