冲校招 刷前端面试题03

208 阅读2分钟

1第一题

const person = { name: "yideng" };

function sayHi(age) {
  return `${this.name} is ${age}`;
}
console.log(sayHi.call(person, 5));
console.log(sayHi.bind(person, 5));

题目主要考察 call和bind的方法 都是方法劫持 改变this的指向

而bind方法则不会立即执行 而是返回一个当前函数 

所以打印结果为 function sayhi(age){

return {this.name} is ${age}};

而call方法改变了this指向 也立即执行 所以打印为 yideng is 5

而apply 的参数是一个类数组

2第二题

const num = {
  a: 10,
  add() {
    return this.a + 2;//this 指向 num
  },
  reduce: () => this.a -2; this指向window 
};
console.log(num.add());
console.log(num.reduce());

本题目考查this的指向问题

 this在对象内部 指向对象本身 

而在箭头函数里面 则指向外部window

所以第一个打印12 第二个打印为undefined  因为this.a 找不到 开辟一个新的 undefined

第三题

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}

本题为一个简单的for循环 执行三次 使用let 定义的i 有自己的块级作用域 

所以能够依次保存自己的值 打印为 0 1 2 假如使用var 则全部打印3

使用let关键字声明变量i:使用let(和const)关键字声明的变量是具有块作用域的(块是{}之间的任何东西)。
在交替期间,i将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}

而这个题目 使用var的时候  根据js的执行机制 当settimeout被执行时 循环早已经跑完了

而此时的i为变量 赋值为3 所以打印 只能打印3次3

第四题

var foo = {
        bar: function(){
            return this.baz;
        },
         baz:1
    }
console.log(typeof (f=foo.bar)());

该题考点是 函数返回值, typeof of后面是一个自调用函数 但是没有返回值 

而foo.bar是考查this的指向问题 谁调用它 它就指向谁 所以指向对象本身 为1

而把1 赋值给 f (f=1)() 函数没有函数值 所以打印为undefined