关于Js中的预解析相信对js有所了解的程序猿都知道,举个例子:
alert(a);
var a = 10;
上面的这个例子会弹出 undefined
,解析过程:var a; alert(a);a = 10;
javascript中的函数绝对是一道美丽的风景,那么有匿名函数存在时,是怎么解析的呢?下面看几个例子,从中一窥究竟.
实例1
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
.
实例2
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
.
实例3
alert(f);// undefined
var f = function(){
alert(1);
}
f(); // 1
var f = function(){
alert(2);
}
f();// 2
两个都是匿名函数,在预解析期间都没有执行,所以第一次是undefined
,之后进行赋值运算,依次显示1
和2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。