JavaScript之解释与执行机制

JavaScript不同于其他的编译性语言如java、C等,运行前要将其编译为机器语言的文件,JavaScript是在运行程序的时候才翻译,即JavaScript是一门解析性脚本语言

解析型语言:程序不需要编译,程序在运行是才翻译成机器语言,每执行一次都要翻译一次
编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言文件,运行是不需要重新翻译,直接使用编译的结果

JavaScript解释与执行

JavaScript按照代码块来进行解释和执行,代码块间相互独立,但变量和方法共享。

JavaScript中的代码块是指由标签分割的代码段

1
<script type="text/javascript">
	var a = 2;
	function b(){
		return 3;}
</script>
<script type="text/javascript">
	console.log(a);
	console.log(b());
</script>

所以上面出来的结果是2和3

解释

javasrcript代码块执行时现由解释器进行解释,主要过程是声明所有var变量(声明时并未初始化赋值,当前值为undefined),解析声明式函数语句(javaScript中函数定义主要主要有两种:声明式与函数表达式),而且是先预定义变量再预定义函数。

1
//声明式函数
function demo(){
	//...
}
//函数表达式
var demo = function (){
	//...
}

代码分析

1
alert(a);
alert('hi');
var a = 1;

弹出undefined和hi,因为执行是先解释(变量提升):先定义var变量,并未初始化赋值,所以当前a为undefined.

看下面代码

1
alert(a);
alert('hi');
a = 1;

会发现报错了,因为a未定义,解释时定义var变量,并不会定义此处的a

到这里我们又发现了一个值得关注的问题–定义变量的方式。

JavaScript变量分两种:全局变量和局部变量。像a = 1;这种定义默认是创建全局变量,其实就相当于window.a = 1;而var a = 1;这种格式是定义一个当前作用域下的变量。解释时只会定义var格式的变量。

函数声明

1
<script>
    a();  
    var a = function(){ //函数表达式
        alert("函数表达式");
    }
    alert('hello1');
</script>
<script>
    a();  
    function a(){ //声明式函数
        alert("声明式函数");
    }
    alert('hello2');
</script>

上面的代码运行后会弹出 声明式函数和hello2 .
因为第一段代码的函数是函数表达式,所以执行时不会被解释,只是定义了a变量,未初始化,值为undefine,不是函数,因为报错而阻塞了下面的代码
又因为javascript代码块之间是相互独立的,所以第二段代码不受影响。