在前端的面试中,this 指向与面向对象是必考题,也是平常开发中绕不开的话题,不少前端
老鸟也会在this 指向这里掉坑。本节课围绕this 指向问题,去分析this 在不一样环境下的不一样指向。javascript
全局环境 浏览器非严格模式环境window,严格模式环境undefind node环境module.exports前端
console.log('全局this',this); // window
函数内部
【this 最终指向的是调用它的对象】
· 普通函数直接调用与window 调用java
let box = document.querySelector('.box'); let lili = document.querySelector('.lili'); box.onclick = move; lili.onclick = move; function move(){ this.style.left = '100px'; console.log('事件this', this) // this指向点击元素(box或lili) }
· 对象中的函数直接调用与window 调用node
var obj ={ a:10, b:function(){ console.log('tag', this) } } window.obj.b() // 对象obj obj.b() // 对象obj
【函数被多层对象所包含,若是函数被最外层对象调用,this 指向的也只是它上一级的对象】
· 多层对象中的函数的this 指向面试
var obj = { a:10, b:{ fn:function(){ console.log(this); } } } window.obj.b.fn(); // 对象b obj.b.fn(); // 对象b
· 对象中的函数被赋值给另外一个变量浏览器
a:10, b:{ fn:function(){ console.log(this); } } } var abc = obj.b.fn; abc(); // window abc.call(obj); // 对象obj

【构造函数中的this 指向的是实例对象】app
· 构造函数中的this 指向 · new 运算符的做用 【若是构造函数中有return 若是return 的值对象,this 指向返回的对象,若是不 是对象,则this 指向保持原来的规则,在这里,null 比较特殊】
箭头函数自己是没有this 和arguments 的,在箭头函数中引用this 实际上调用的是定义
是的上一层做用域的this。这里强调一下是上一层做用域,因对对象是不能造成独立的做用
域的。函数
call / apply / bindthis