JavaScript 中的
bind
、call
和apply
方法都是预定义的函数原型方法,这三个方法都可以用来改变函数的调用上下文,也就是this
的指向。
但它们在参数传递和返回结果上有所区别:
-
call 方法:
call
方法调用一个对象的一个方法,用另一个对象替换当前对象。- 语法:
fun.call(thisArg, arg1, arg2, ...)
thisArg
是在fun
函数运行时使用的this
值。arg1, arg2, ...
是传递给fun
函数的参数,它们可以是任意数量的参数。call
方法立即执行函数。
示例:
function showName(age, gender) {console.log(this.name, age, gender); } var person = {name: '张三' }; showName.call(person, 25, '男'); // 输出: 张三 25 男
-
apply 方法:
apply
方法与call
方法类似,也是用来改变函数的调用上下文。- 语法:
fun.apply(thisArg, [argsArray])
thisArg
与call
方法中的thisArg
相同。[argsArray]
是一个数组或类数组对象,其中包含着传递给fun
函数的参数。apply
方法也是立即执行函数。
示例:
function showName(age, gender) {console.log(this.name, age, gender); } var person = {name: '李四' }; showName.apply(person, [30, '女']); // 输出: 李四 30 女
-
bind 方法:
bind
方法会创建一个新函数,这个新函数的this
被指定为bind
方法的第一个参数,而其余参数将作为新函数的参数。- 语法:
fun.bind(thisArg, arg1, arg2, ...)
thisArg
是绑定this
的值。arg1, arg2, ...
是当新函数被调用时,预先提供的参数。bind
方法返回一个新函数,并不立即执行。
示例:
function showName(age, gender) {console.log(this.name, age, gender); } var person = {name: '王五' }; var boundShowName = showName.bind(person, 35); boundShowName('男'); // 输出: 王五 35 男
总结来说,call
和 apply
都会立即执行函数,区别在于参数传递的方式不同,call
是逐个传递,而 apply
是以数组形式传递。bind
方法则返回一个新函数,可以延迟执行,并且可以预设一些参数。在实际开发中,可以根据需要选择最合适的方法来改变函数的调用上下文。