javascript - js前端笔试题
伊谢尔伦
伊谢尔伦 2017-04-10 16:26:26
0
7
696

js笔试题,回来总结的时候发现有2道题目写错了

(function(x){ delete x; return x; })(1); //1 (function f(){ function f(){return 1;} return f();//2 function f(){return 2;} })();

达达们麻烦解释一下输出结果的来龙去脉。另求授我以渔,每次笔试题遇到此类的题目,都有一些不会做的,归根到底是js底子太薄了,求助,理清上面题目的逻辑需要看js的哪方面知识,谢谢。

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

reply all (7)
Peter_Zhu

1,这两个都是自执行函数,第一个由于javascript中基本数据类型无法被删除,只能删除对象的属性,所以delete之后对x没有影响,第二个由于函数定义会提升到前面去,也就是这两个f函数在return语句之前被定义,所以后面一个覆盖前面一个,返回2
2,需要了解自执行函数,delete操作符,变量和函数提升(hoisting)就可以解这道题了吧。可以认真看一遍javascript权威指南,这样基础的东西就差不多都了解啦

    阿神

    (function(){})():自执行匿名函数,声明了一个匿名函数然后立即执行。

    第1道题目:

    (function(x){ delete x;//false return x; })(1); //1

    delete是一元操作符,它用来删除对象属性或者数组元素。然而,并不是所有的属性都可以删除:

    1. 一些内置核心和客户端属性不能删除;

    2. 通过var语句声明的变量不能删除;

    3. 通过function语句定义的函数和函数参数不能删除。

    所以,结果输出1

    第2道题目:

    (function f(){ function f(){return 1;} return f();//2 function f(){return 2;} })();

    考察的知识点主要是函数声明提升。
    js解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码前可用(可以访问)。函数声明提升以后,变成如下代码:

    (function f(){ function f(){return 1;} function f(){return 2;} return f(); })();

    js中没有函数重载,重名的函数后面的会覆盖前面的,代码相当于这样:

    (function f(){ function f(){return 2;} return f(); })();

    所以结果输出2

    第1题考查js操作符的知识,第2题考查js函数相关的知识,这些基础知识点需要认认真真过一遍书本啊,《JavaScript高级程序设计(第3版)》、《JavaScript权威指南》里面都有详细的讲解,没事多翻翻。基础知识点,首先你得见过,然后多翻多记,没有捷径啊~~~

      刘奇

      JS本来设计的就各种坑,记它没什么意义,用个 eslint jslint 之类的就不会出现这么蠢的写法,
      用 esint 第一个会报
      error: Deleting local variable in strict mode
      第二个会报
      error "f" is already defined
      es6 都用 let 了,var 都要过时了

        黄舟

        这两个都是自执行匿名函数 IIFE (Immediately Invoked Function Expression)
        格式如下:

        (function foo(){ .. })()
          迷茫

          建议楼主看下
          http://benalman.com/news/2010/11/immediately-invoked-function-expression/

            Ty80

            delete 操作符的详细解析可以参考:http://www.cnblogs.com/yuzhongwusan/archive/2012/06/14/2549879.html

              刘奇

              1、第一道题中的X是参数,函数中的参数相当于在函数内部 var x = 1,即新建一个变量并赋值,
              而直接用delelte是删除不了变量的;

              2、第二道题是要了解函数声明和函数表达式之间的区别,
              使用函数声明即:

              function f(){}

              这种方式创建函数,在代码运行之前,会通过函数声明提升的过程,预先读取函数声明;
              而通过函数表达式即:

              var f = function(){}

              这种方式创建函数,必须等到解析器执行到函数表达式所在的代码行才能创建函数。

              a)题目中的两个函数均是函数声明,因此,代码执行前会预读取两个函数;
              b)又因为两个函数同名,所以后一个函数会覆盖前一个函数。
              所以结果是2.

                Latest Downloads
                More>
                Web Effects
                Website Source Code
                Website Materials
                Front End Template
                About us Disclaimer Sitemap
                php.cn:Public welfare online PHP training,Help PHP learners grow quickly!