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的哪方面知识,谢谢。
1,这两个都是自执行函数,第一个由于javascript中基本数据类型无法被删除,只能删除对象的属性,所以delete之后对x没有影响,第二个由于函数定义会提升到前面去,也就是这两个f函数在return语句之前被定义,所以后面一个覆盖前面一个,返回2
2,需要了解自执行函数,delete操作符,变量和函数提升(hoisting)就可以解这道题了吧。可以认真看一遍javascript权威指南,这样基础的东西就差不多都了解啦
(function(){})():自执行匿名函数,声明了一个匿名函数然后立即执行。
第1道题目:
delete是一元操作符,它用来删除对象属性或者数组元素。然而,并不是所有的属性都可以删除:
一些内置核心和客户端属性不能删除;
通过var语句声明的变量不能删除;
通过function语句定义的函数和函数参数不能删除。
所以,结果输出1
第2道题目:
考察的知识点主要是函数声明提升。
js解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码前可用(可以访问)。函数声明提升以后,变成如下代码:
js中没有函数重载,重名的函数后面的会覆盖前面的,代码相当于这样:
所以结果输出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)
格式如下:
建议楼主看下
http://benalman.com/news/2010/11/immediately-invoked-function-expression/
delete 操作符的详细解析可以参考:http://www.cnblogs.com/yuzhongwusan/archive/2012/06/14/2549879.html
1、第一道题中的X是参数,函数中的参数相当于在函数内部 var x = 1,即新建一个变量并赋值,
而直接用delelte是删除不了变量的;
2、第二道题是要了解函数声明和函数表达式之间的区别,
使用函数声明即:
这种方式创建函数,在代码运行之前,会通过函数声明提升的过程,预先读取函数声明;
而通过函数表达式即:
这种方式创建函数,必须等到解析器执行到函数表达式所在的代码行才能创建函数。
a)题目中的两个函数均是函数声明,因此,代码执行前会预读取两个函数;
b)又因为两个函数同名,所以后一个函数会覆盖前一个函数。
所以结果是2.