https://juejin.im/post/5aa1eb056fb9a028b77a66fd

普通函数中的this

function test(name) {
    console.log(name)
    console.log(this)
}
test('Jerry')  //调用函数, 这其实是简写

test.call(undefined, 'Tom')//完整写法
//此时严格模式下this 是undefined
//宽松模式下this 是window

普通函数手动指定this

const obj = {
    name: 'Jerry',
    greet: function() {
        console.log(this.name)
    }
}
obj.greet.call({name: 'Spike'})  //打出来的是 Spike

普通函数函数完整的调用方法是使用call方法

包括test.call(context, name)obj.greet.call(context,name)

这里的context就是函数调用时的上下文,也就是this

只不过这个this是可以通过call方法来修改的

构造函数稍微特殊一点

它的this直接指向new之后返回的对象

window.setTimeout()window.setInterval()

默认的是this是window对象。

箭头函数使用call 会自动忽略第一个参数

箭头函数总是匿名的, 并且不绑定自己的this, arguments, super, new.target

super 关键字, 父对象的引用

new.target 属性, 用来检测函数是否通过new 运算符调用

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions

箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或 new.target。这些函数表达式更适用于那些本来需要匿名函数的地方,并且它们不能用作构造函数。