一、今天在群里看见有同学发了几道关于js的笔试题,拿来研究一下,虽然自己看过了高级程序设计,也看了javascript语言精粹,自以为对js还是有一些理解的,但是真正遇到问题的时候,发现并不能融会贯通,掌握的不扎实。借此机会来回顾一下,共同学习~
二、几道小题(写出以下几道题的弹出框的内容)
(1)
1 if(!("a" in window)){ 2 var a=1; 3 } 4 alert(a);
解析:正常的思路:首先需要了解函数声明提升的概念,在执行代码之前,会先读取函数或者变量的声明。所以在if语句判断a是否存在于window的时候答案是:yes。也就是说if中的判断条件是不成立的,也就不会执行if中的代码。执行到alert语句的时候,因为a只做了声明没有赋值,所以结果是undefine!实际的答案是:1。呐,不要质疑自己,你的思路很正确,只是漏掉了一点细节而已,if判断中是"a",是一个字符串,而我们声明赋值的那个是一个变量,不是一个哦~因为字符串a没有定义,所以不存在于window对象中~
(2)
1 function a(x){ 2 return x*2; 3 } 4 var a; 5 alert(a);
解析:上题我们就提到函数声明提升的概念。在这里也就是说会有两个声明提升,我个人的理解两个声明是一样的,都是a,也就是一个变量声明了两次,可以看成是同一个。执行代码的时候调用的就是function了,所以最后答案是:alert函数a。
变形:如果把 var a 替换成 var a=1 结果会怎样呢?
(3)
1 var a=1; 2 b=function a(x){ 3 x&&a(--x); 4 }; 5 alert(a);
解析:不需要看函数的内部实现,我们先来看函数的结构。一个变量a,一个函数表达式b,答案自然是b。最开始我也是有疑惑的,经过尝试发现,这种形式的函数表达式当中的a不会发生函数声明提升,同时b只能在函数内部访问,不能在外部访问。由此得出结论:这样给函数表达式的匿名函数增加标识符的意义不大。
(4)
1 function a(){ 2 alert(this); 3 } 4 a.call(null);
解析:解这道题需要注意两个问题:1、call的用法 2、null的特殊性;call和apply的用法都是劫持另一个对象的方法,继承另一个对象的属性,只是他们的参数有差异,在这里不涉及,有兴趣的童鞋可以自己去补习一下~在这道题里,将a函数的执行上下文改成了括号中的对象。正常的情况,是应该输出括号中的对象的,但是null和undefined比较特殊,ECMAScript5中有介绍,当call的参数是null和undefined的时候,执行上下文是全局,在浏览器中window是全局对象,所以alert出的是window。
三、总结:个人想法,欢迎大家多多提出意见和不同看法,共同学习~~啦啦~~