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