call()
call() 方法第一个参数是作为函数上下文的对象,后面传入的是一个参数列表,而不是单个数组。
语法:
call(obj,args)
实例:
var name = '张三', age = 13;
var obj = {
name: '李四',
objAge: this.age,
fun: function (c, t) {
console.log(`${this.name} 今年${this.age}岁 来自${c} 要去${t}旅游`)
}
}
var obj2 = {
name: '王五',
age: 15
}
obj.fun.call(obj2, '北京', '上海') // 王五 今年15岁 来自北京 要去上海旅游
apply()
apply() 方法第一个参数也是做为函数上下文的对象,但是后面传入的是一个函数参数组成数组。
语法:
apply(obj,[arg1,arg2])
实例:
var name = '张三', age = 13;
var obj = {
name: '李四',
objAge: this.age,
fun: function (c, t) {
console.log(`${this.name} 今年${this.age}岁 来自${c} 要去${t}旅游`)
}
}
var obj2 = {
name: '王五',
age: 15
}
obj.fun.call(obj2, '北京', '上海') // 王五 今年15岁 来自北京 要去上海旅游
bind()
bind() 方法会创建一个新函数,当这个新函数被调用时,它的 this 值是传递给 bind() 的第一个参数, 它的参数是 bind() 的其他参数和其原本的参数。
语法:
bind(thisArg[, arg1[, arg2[, ...]]])
实例:
var name = '张三', age = 13;
var obj = {
name: '李四',
objAge: this.age,
fun: function (c, t) {
console.log(`${this.name} 今年${this.age}岁 来自${c} 要去${t}旅游`)
}
}
var obj2 = {
name: '王五',
age: 15
}
obj.fun.bind(obj2, '北京', '上海')() // 王五 今年15岁 来自北京 要去上海旅游
从上面的例子可以看出来,call()、apply()、和bind()方法的第一个参数都是this
指向的对象。call()和bind()方法使用时传入的参数都是参数列表,call()和bind()方法的不同点是bind()方法返回的一个函数,apply()方法不同传入的参数是数组。
当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!