【JS】那些巨坑的的面试题二

一、前言

不知道上一篇的几个面试题大家做的怎么样了~
感觉如何?是不是很坑。
但是其实这些奇葩的面试题往往考的都是你的基础知识掌握的如何~
一旦基础知识掌握的很好,那么这些面试题都是小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对象

拜拜~
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容