关于Js中的预解析相信对js有所了解的程序猿都知道,举个例子:javascript
alert(a); var a = 10;
上面的这个例子会弹出 undefined
,解析过程:var a; alert(a);a = 10;
java
javascript中的函数绝对是一道美丽的风景,那么有匿名函数存在时,是怎么解析的呢?下面看几个例子,从中一窥究竟.函数
实例1code
alert(f); // function f(){alert(2);} function f(){ alert(1); } alert(f); // function f(){alert(2);} f(); // 2 function f(){ alert(2); } f(); // 2
对于使用function
语句声明的函数,js解释器就会在预编译期间把函数处理,这个处理就是创建函数索引.索引
因此预解析期间对函数f
创建索引,程序从上往下执行,函数f
指向function f(){alert(1);}
,继续往下,还有一个函数f
,此时将第一创建的索引覆盖掉,此时函数f
指向的是function f(){alert(2);}
.到这里预解析阶段结束,而后进行执行,第一次alert
显然弹出function f(){alert(2);}
,第二次一样也是,f()
执行弹出2
,第二次f()
也一样弹出2
.ip
实例2io
alert(f);// function(){alert(2);} var f = function(){ alert(1); } alert(f);// 1 f(); //1 function f(){ alert(2); } f();// 1 alert(f); // function(){alert(1)}
实例2与实例1 相比,将第一个函数f
写成了匿名函数,预编译阶段,对匿名函数不作任何处理,直到执行期才按表达式逐行进行解释,全部返回的结果就不同了.预解析期间获得的函数是function f(){alert(2);}
,可是执行到匿名函数,将函数f
从新赋值了,改变了函数f
.编译
实例3function
alert(f);// undefined var f = function(){ alert(1); } f(); // 1 var f = function(){ alert(2); } f();// 2
两个都是匿名函数,在预解析期间都没有执行,因此第一次是undefined
,以后进行赋值运算,依次显示1
和2
class