zoukankan      html  css  js  c++  java
  • 一道前端面试题,关于函数声明和函数表达式

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

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

  • 相关阅读:
    set--常见成员函数及基本用法
    [Swust OJ 1026]--Egg pain's hzf
    [HDU 1111]--Secret Code
    [Swust OJ 1139]--Coin-row problem
    [Swust OJ 781]--牛喝水
    [Swust OJ 1132]-Coin-collecting by robot
    [Swust OJ 249]--凸包面积
    HTTP 请求头中的 X-Forwarded-For
    HTTP 下载文件中文文件名在 Firefox 下乱码问题
    数据挖掘系列 (1) 关联规则挖掘基本概念与 Aprior 算法
  • 原文地址:https://www.cnblogs.com/happycloud/p/3013474.html
Copyright © 2011-2022 走看看