call()、apply()、bind() 都是用来重定义 this 对象
call 和 apply 调用后都会立即执行函数
bind 会返回函数本身,使用 bind 可以把函数作为回调,并向回调中传递额外的参数
function func(a, b, c) {
console.log(`a => ${a}, b => ${b}, c => ${c}, this.name => ${this.name}`)
}
obj1 = {
name: 'obj1',
func: function(a, b, c) {
console.log(`a => ${a}, b => ${b}, c => ${c}, this.name => ${this.name}`)
},
}
obj2 = {
name: 'obj2',
func: function(a, b, c) {
console.log(`a => ${a}, b => ${b}, c => ${c}, this.name => ${this.name}`)
}
}
func.call() //
func.call(obj2, 1, 2) // a => 1, b => 2, c => undefined, this.name => obj2
func.call(obj2, [1, 2]) // a => 1,2, b => undefined, c => undefined, this.name => obj2
func.apply() //
func.apply(obj2, 1, 2) // error
func.apply(obj2, [1, 2]) // a => 1, b => 2, c => undefined, this.name => obj2
func.bind() // 返回函数 func
func.bind(obj2, 1, 2)() // a => 1, b => 2, c => undefined, this.name => obj2
func.bind(obj2, [1, 2])(3) // a => 1,2, b => 3, c => undefined, this.name => obj2
func.bind(obj2, 1, 2)(3) // a => 1, b => 2, c => 3, this.name => obj2