之前博主去苏宁总部面试的分享漏了一个this指针的面试题,整理如下,问了两个方面。
有兴趣的猿友可以 点击这里 查看之前面试分享。
this指向有哪几种情况:
全局作用域
或者普通函数
自执行中this指向全局对象window事件函数
内部的this指向事件源:注意在事件函数中如果包含普通函数,普通函数自执行后,内部this还是指向window对象方法
调用时,this指向调用的对象
1、全局作用域 / 普通函数中的this
this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this指向的是window;当函数被作为某个对象的方法调用时,this就等于那个对象。
//全局作用域
console.log(this); //Window
//普通函数
function fn(){
console.log(this); //Window
}
2、事件函数中的this指向事件源
3、对象方法调用时,this指向调用的对象
let obj = {
name : "lanlan",
fn : function(){
console.log(this);
},
lacy:{
name : "didi",
fn : function(){
let num = 10;
console.log(this);
}
}
};
obj.fn(); //obj
obj.dudu.fn(); //lacy
4、类实例来调用函数时,this指向实例
class B {
fn() {
console.log(this)
}
}
var b = new B()
var fun = b.fn
b.fn() // 指向 b
fun() // undefined
ES6 下的 class 内部默认采用的是严格模式,fun不会指定全局对象为默认调用对象
5、 ES6箭头函数的this
箭头函数中的this始终指向箭头函数定义时的离this最近的一个函数,如果没有最近的函数就指向window
箭头函数的this是在定义函数时绑定的,不是在执行过程中绑定的。简单的说,函数在定义时,this就继承了定义函数的对象。
补充:
箭头函数和普通函数相比,有以下几个区别,在开发中应特别注意:
- 不绑定 arguments 对象,也就是说在箭头函数内访问 arguments 对象会报错;
- 不能用作构造器,也就是说不能通过关键字 new 来创建实例;
- 默认不会创建 prototype 原型属性;
- 不能用作 Generator() 函数,不能使用 yeild 关键字。
微信公众号: 情非得已小猿猿(FrontendApe)