忘了从哪里找来抄下来的:

js执行顺序问题

1.函数的声明和调用
“定义式”函数声明
  function fn1() {......}
"赋值式"函数声明
  var f=function fn1() {......} 
  页面加载过程中,浏览器会对页面上或载入的每个js代码块(或文件)进行扫描,如果遇到定义式函数,则进行预处理(类似于C等的编译),处理完成之后再开始由上至下执行;遇到赋值式函数,则只是将函数赋给一个变量,不进行预处理(类似1中变量必须先定义后引用的原则),待调用到的时候才进行处理。
eg:函数调用与声明先后的问题
  fn1();//正常执行,输出 “234”
  function fn1() {alert(123);}
  fn1();//输出 “234” 先预编译声明,预编译时后面的声明已经覆盖前面的声明
  function fn1() {alert(234);}
  fn1();//输出 “234”
------------------------------
  fn1();//运行报错,浏览器未对fn1赋值定义进行预处理,依序执行,函数未定义,报错
  var fn1 = function() {alert(123);}
  fn1();//输出 “123” 按顺序执行
  fn1 = function() {alert(234);}
  fn1();//输出 “234” 后面的赋值覆盖了前面的
-------------------------------
“代码块”是指一对<script type=”text/网页特效”></script>标签包裹着的js代码,浏览器对每个块或文件进行独立的扫描,然后对全局的代码进行顺序执行。所以,在一个块(文件)中,函数可以在调用之后进行“定义式”定义;但在两个块中,定义函数所在的块必须在函数被调用的块之前。

eg:
<script type="text/javascript">
  Fn();
</script>
<script type="text/javascript">
  function Fn(){
  alert("Hello World!");
}
</script>
// 报错:Fn is notdefined,解决方法 两个块换过来。先声明,在调用
--------------------------------------
body的onload函数与body内部函数的执行
body内部的函数会先于onload的函数执行
eg:
//html head...
<head>
<script type="text/javascript">
  function fnOnLoad(){ alert("I am outside the Wall!"); }
</script>
</head>
<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代码会在这一事件触发之前运行(为什么呢?下面线程讨论告诉你..)
-----------------------------
js是多线程or单线程
严格说js没有多线程的概念,所有的线程都是单线程依次执行。
eg:
function fn1() {alert(“1到100加和是4950”);}
function fn2() {alert ("早知道,就不说");}
fn1();
fn2();
//先弹出 “1到100加和是4950”,后弹出 "早知道,就不说"

延时执行、Ajax异步加载,不是多线程的吗?不是。看起来像“多线程”
eg:
function fn1(){
setTimeout(function(){
alert("我先调用")
},1000);
}
function fn2(){
alert("我后调用");
}
fn1();
fn2();
// 先弹出:“我后调用”,
// 1秒后弹出:“我先调用”
看上去,fn2()和延时程序是分两个过程再走,但其实,这是JavaScript中的“回调”机制在起作用,类似于操作系统中的“中断和响应” ——延时程序设置一个“中断”,然后执行fn2(),待1000毫秒时间到后,再回调执行fn1()。
同样,上面中body的onload事件调用的函数,也是利用了回调机制——body加载完成之后,回调执行fnOnLoad()函数。
Ajax请求中的数据处理函数也是一样的道理。
关于JavaScript线程问题的更深入讨论,看这篇 javascript中的线程之我见,以及infoQ上的 JavaScript多线程编程简介。
困了,再说一下回调函数吧。

7. 回调函数
回调函数是干嘛用的?就是回调执行的函数嘛,又废话:D
如6所说,最常见的回调就是onclick、onmouseo教程ver、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);

最新文章

  1. Epson机械手4轴6轴示意图
  2. 第六章第一个linux个程序:统计单词个数
  3. 三级联动(在YII框架中)
  4. VMware简介
  5. communicate with other processes, regardless of where they are running
  6. 理解C++ static
  7. openerp经典收藏 OpenERP库存管理的若干概念讲解(新增库存价值)(转载)
  8. Service知识点总结
  9. 重启adb服务
  10. oracle触发器应用
  11. jquery-ajax实现文件上传异常处理web.multipart.MultipartException
  12. opengl启动过程
  13. Nagle算法
  14. SpringBoot Redis缓存 @Cacheable、@CacheEvict、@CachePut
  15. zabbix安装源
  16. P1403 [AHOI2005]约数研究
  17. Flutter之MaterialApp使用详解
  18. chrome浏览器调试工具你会使用吗?
  19. BZOJ.3585.mex(线段树)
  20. Spring Maven项目集成Springboot

热门文章

  1. 跨平台移动开发phonegap/cordova 3.3全系列教程-开发环境搭建
  2. python super用法
  3. 腾讯云服务器CVM购买详细过程 选择我们需要的腾讯云服务器
  4. Metasploitable渗透测试实战——Windows漏洞 MS08-067复现
  5. pat乙级1049
  6. 新建framework的bundle资源 linker command failed with exit code 1解決
  7. IOS NSKeyedArchiver(归档存取数据)
  8. JAVA设计模式初探之桥接模式
  9. 【洛谷4149】[IOI2011] Race(点分治)
  10. 2017.12.17 servlet 生命周期