一道前端面试题,关于函数声明和函数表达式

题目如下(这也是我上篇随笔中的代码):

<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,现在你明白了吧~~

原文地址:https://www.cnblogs.com/happycloud/p/3013474.html