四种情况:
- 默认绑定: 直接调用函数指向window
- 隐式绑定: 对象里调用,绑定调用的对象
- new绑定
- 显式绑定
call apply bind

var name = 'window'var person1 = {name: 'person1',foo1: function() {console.log(this.name);},foo2: () => console.log(this.name),foo3: function() {return function() {console.log(this.name);}},foo4: function() {return () => {console.log(this.name);}}}var person2 = {name: 'person2'}person1.foo1() // person1 隐式绑定person1person1.foo1.call(person2) // person2 显式绑定person2person1.foo2() // windowperson1.foo2.call(person2) // windowperson1.foo3()() // windowperson1.foo3.call(person2)() // windowperson1.foo3().call(person2) // person2person1.foo4()() // person1person1.foo4.call(person2)() // person2person1.foo4().call(person2) // person1
