又经过两年的开发,关于this的问题在日常工作中用到的真不多,但是面试还是老生常谈,再次整理笔记,重新来认识this,因为this是和执行上下文绑定的,执行上下文分为三种:全局执行上下文、函数执行上下文、eval执行上下文,所以我们把this分为:全局执行上下文中的this、函数中的this和eval中的this。
- 全局执行上下文中的this
- 浏览器中全局对象: window
- node中全局对象: global
在浏览器控制台打印console.log(this);得到的结果就是window。
函数中的this (下面只讨论浏览器环境,非严格模式)
- 默认直接调用一个函数,在函数中的this为window。
- 通过call、bind、apply改变执行上下文中this的指向(显式绑定)。
- 通过对象调用其内部的方法,函数中this指向对象本身(隐式绑定)。
- 构造函数中this就是对象本身。
- 箭头函数比较特殊,没有自己的this,继承上一层函数的,其实在外部函数中设置self和使用箭头函数原理是一致的。
eval中的this (不太常用,略)
练手来啦:
// 隐式绑定失效,当函数作为参数(即引用)的时候,丢失this。
const obj1 = {
a: 1,
fn: function() {
console.log(this.a)
}
}
const fn1 = obj1.fn // 将引用给了 fn1
fn1()
function run(fn) {
fn()
}
run(obj1.fn)
// 一般匿名函数的this也是全局对象 ,或者IIFE
var name = 'The Window';
var obj = {
name: 'My obj',
getName: function() {
return function() { // 这是一个匿名函数
console.log(this.name)
};
}
}
obj.getName()()