javaScript代码执行顺序

javaScript是一种描述型脚本语言,由浏览器进行动态的解析和执行。 页面加载过程中,浏览器会对页面上载入的每个js代码块进行扫描。 JavaScript是一段一段的分析执行的,在分析执行同一段代码中,定义式函数会 被提取出来优先执行。函数定义执行完毕后,才会按顺序执行其他代码。

一、代码块

JavaScript代码块是由一对script开始标签和结束标签包裹的一段代码。 JavaScript是按照代码块来进行编译和执行的,代码块之间相互独立,但是前面执行的变量和方法,后面的代码块可以使用。 前面代码块报错,不影响后面代码块的执行。

二、预处理期和执行期

JavaScript的执行过程分为两个阶段:预处理期和执行期。 预编译期会对本代码块中的所有声明的变量和函数(此时处理的只是声明式函数,而非赋值式函数)进行处理,变量和函数只是进行了声明,并未进行初始化及赋值(即只是分配了内存)。

三、执行顺序

首先进行预处理,之后按照代码的顺序执行代码。

四、声明式函数和赋值式函数

1.声明式函数

function Fun(){

}

2.赋值式函数

var Fn = function{

}

五、变量作用域及作用域链

函数执行过程中,每遇到一个变量,都会经历一次标示符解析的过程,决定从哪里获取及存储数据 。该过程从作用域链的活动对象开始查找,如果找到了就用这个标示符,如果没有找到就 继续搜索作用域链中的下一个对象,如果搜索完所有的对象都未找到,则认为该标示符未定义。 因此标示符所在的位置越深,读写速度越慢,全局变量总是在作用域链的最末端,因此编写代码时应该尽量少使用全局变量 如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。 因此,如果局部变量和全局变量同名,则程序会使用局部变量而不是全局变量。 var a = "globalStr"; function fun(){ alert(a); var a = "innerstr"; }//弹出undefined。 局部变量a只进行声明并没有赋值,因此输出undefined。

function fun(){

alert(“测试内容1”);

}

fun();

function fun(){

alert(“测试内容2”);

}

fun();

两次函数调用都输出“测试内容2"

这表明,在JavaScript分析执行同一段代码时,定义式的函数会被提取出来优先执行。之后,才会按顺序执行 其他的代码。也就是第一个函数被调用之前已经被第二个函数覆盖了,因此第一次调用函数也同样输出第二个函数的内容。