js前端笔试题

pingfengafei
  • 560

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的哪方面知识,谢谢。

回复
阅读 8.8k
7 个回答
✓ 已被采纳

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(){ .. })()

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

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

function f(){}

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

var f = function(){}

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

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

宣传栏