一、前言
不知道上一篇的几个面试题大家做的怎么样了~
感觉如何?是不是很坑。
但是其实这些奇葩的面试题往往考的都是你的基础知识掌握的如何~
一旦基础知识掌握的很好,那么这些面试题都是小case了啊!!!
小case滴啦~
二、关于 for 循环的面试题
你认为这个应该打印出来什么结果呢?why?
for (var i = 0,j = 0; i < 4,j < 7; i++,j++) {
console.log(i);
}
三、关于this的面试题
function fn1() {
console.log(this);
}
var arr=['a','b'];
arr.a=fn1;
arr.a();
setTimeout(arr.a,1000);
四、关于this的面试题
var myObject={
foo:"abc",
fun:function (){
var self=this;
alert(this.foo);
alert(self.foo);
(function (){
alert(this.foo);
alert(self.foo);
}());
}
}
myObject.fun();
老规矩: 停-------再翻就看到答案了,先做出答案再看解析
我不看我不看
五、答案解析
1) 第一题
答案:打印0,1,2,3,4,5,6
这个题关键点,就在for循环中定义了两个变量,还有两个判断。
那到底那一次的判断才算数呀?
其实这个题考的不是 for循环
,而是考 逗号操作符
。
- 逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n
- 小案例:
var a=(1,2,3);
这个代码执行后a=?
。答案是 a=3。
逗号操作符的优先级别在所有运算符中是最低的,结合方向是"自左至右"的。
如果遇到逗号操作符,说明当前的语句并没有执行结束。
- 所以在这道面试题中,
i<4,j<7
,这句话会执行到j<7
结束。- 接下来你可互换一下
i<4,j<7
,变成j<7,i<4
尝试一下结果验证一下。
2)第二题
答案:第一句弹出 数组arr,第二句弹出 window对象
- 函数 fn1 被复制给arr的属性a上,函数变成了arr的a方法。
- 后边arr调用了自己的方法a,所以a方法的this指向arr
- 计时器中,是借用了arr的a方法,并不是arr调用的。而是延迟1s后直接调用的,那是谁呢?window 啊。
3)第三题
答案:“abc”,“abc”,undefined,“abc”
- 这道题考的还是关于this的执行。
- 因为this在不用的环境下是会改变指向的。
变量self
保存的当前的this,所有在能调用self的地方。使用的都是self当时保存的this。
- 前两个self和this相等,所以都打印"abc"
- 而在fun函数中的
匿名函数自调用
的函数中 this指向的是window。而
self还是之前保存的this。所以一个打印"abc",一个打印window对象
拜拜~