一道前端面试题,关于函数声明和函数表达式
题目如下(这也是我上篇随笔中的代码):
<script type="text/javascript" > function x(){ alert(2); } x(); var x=function(){ alert(0); }; x(); var x=function(){ alert(1); }; x(); function x(){ alert(3); } x(); </script>
当时我的第一反应就是2013,这不很EASY么(以前高中做数学题,一些答案总会是些该年年份)!
得知答案不对时,脑子第一反应居然是函数无重载!!!3333,幸亏没说这个答案,不然对面肯定2333 了==!
后来将这个代码亲自试了一下,答案是3011!!!
后来,就自己思考了一下,首先解析器会优先解析函数声明,这样的话,第一个函数很明显会被第四个覆盖,那第一个数字是3就不奇怪了~~然后到了代码的执行阶段,变量式就会顺序执行显示0,1。但是为什么最后一个结果依然是1呢?然后我就尝试修改了这段代码:
/*function x(){ alert(2); } x(); var x=function(){ alert(0); }; x();*/ var x=function(){ alert(1); }; x(); function x(){ alert(3); } x();
答案会是什么呢?是1,1!!
还是因为对函数声明优先解析的原因,解析器在执行前优先解析声明式,但是执行过程中会再解析变量式,所以这个时候变量式就会覆盖声明式(只有同名函数适用)!查看一下代码:
var x=function(){ alert(1); }; function x(){ alert(2); } x();
答案输出是1,现在你明白了吧~~