首页 > 代码库 > js预编译

js预编译

先来做三个测试

eg1:

1 var a;2 a = 1;3 4 function a() {};5 console.log(a);

eg2:

1 var a;2 function a() {};3 console.log(a);

eg3:

1 var a;2 function a() {};3 a = 1;4 console.log(a);

eg1:输出1   eg2:输出a方法   eg3:输出1

为什么输出结果是这样的?

先来看看js预编译实现过程:

  1.js首先扫描var关键字,提前到顶端;

  2.然后扫描function定义,提到var之后

  3.然后再顺序执行

那么上面的三个例子预编译形式分别如下:

eg1:

1 var a;2 3 function a() {};4 a = 1;5 console.log(a);

eg2:

1 var a;2 3 function a() {};4 console.log(a);

eg3:

1 var a;2 3 function a() {};4 a = 1;5 console.log(a);

 

了解预编译过程后可以再来看看下面几个例子,试着先做一下

   1.

f();function f(){    console.log("a");}==========================================f();var f = function(){    console.log("a");}

第一个程序 运行输出:1 ;第二个程序运行报错,f is not a function()  

  2.

function f(){    console.log("a");}f();function f(){    console.log("b");}f();==========================================function f(){    console.log("a");}f();var f = function(){    console.log("b");}f();=============================================var f = function(){    console.log("a");}f();function(){    console.log("b");}f();

第一个输出:b b   ;   第二个输出:a b   ;    第三个输出:a a

 

 

js引擎读取一段js代码,首先预编译,寻找全局变量和全局函数,遇到全局变量,把变量的值变为undifined存放在内存中,并不进行赋值操作,遇到全局函数,也是存放在内存中,如果这个过程中发现语法错误,预编译终止。

 

js预编译