返回
call、apply、bind 的用法和区别详解
前端
2023-11-29 18:18:05
在 JavaScript 中,call()
、apply()
和 bind()
是三个非常重要的函数调用方法,它们都可以改变函数内部的 this
指向。这篇文章将详细讲解这三个方法的用法和区别。
1. call() 方法
call()
方法可以将一个函数绑定到一个对象上,并以这个对象作为 this
的值来调用该函数。语法格式如下:
function.call(thisArg, arg1, arg2, ...)
其中:
function
是要调用的函数。thisArg
是要绑定到函数上的对象。arg1
、arg2
、... 是要传递给函数的参数。
例如,以下代码将 sum()
函数绑定到 obj
对象上,并以 obj
作为 this
的值来调用该函数:
function sum(a, b) {
return a + b;
}
const obj = {
a: 1,
b: 2
};
console.log(sum.call(obj)); // 3
2. apply() 方法
apply()
方法与 call()
方法类似,也可以将一个函数绑定到一个对象上,并以这个对象作为 this
的值来调用该函数。语法格式如下:
function.apply(thisArg, [args])
其中:
function
是要调用的函数。thisArg
是要绑定到函数上的对象。args
是一个数组,包含要传递给函数的参数。
apply()
方法与 call()
方法的主要区别在于,apply()
方法的参数是通过数组的形式传递的,而 call()
方法的参数是通过逐个传递的形式传递的。
例如,以下代码将 sum()
函数绑定到 obj
对象上,并以 obj
作为 this
的值来调用该函数:
function sum(a, b) {
return a + b;
}
const obj = {
a: 1,
b: 2
};
console.log(sum.apply(obj, [1, 2])); // 3
3. bind() 方法
bind()
方法可以将一个函数绑定到一个对象上,并返回一个新的函数。这个新函数的 this
值将被绑定到指定的 thisArg
值,即使该函数在以后被调用时,它的 this
值也不会改变。语法格式如下:
function.bind(thisArg, arg1, arg2, ...)
其中:
function
是要调用的函数。thisArg
是要绑定到函数上的对象。arg1
、arg2
、... 是要传递给函数的参数。
例如,以下代码将 sum()
函数绑定到 obj
对象上,并返回一个新的函数:
function sum(a, b) {
return a + b;
}
const obj = {
a: 1,
b: 2
};
const boundSum = sum.bind(obj);
console.log(boundSum()); // 3
4. call()、apply() 和 bind() 的区别
这三个方法的主要区别在于参数的传递方式和返回结果。
call()
方法的参数是逐个传递的,并且直接调用函数。apply()
方法的参数是通过数组的形式传递的,并且直接调用函数。bind()
方法的参数是逐个传递的,但它不直接调用函数,而是返回一个新的函数。这个新函数的this
值将被绑定到指定的thisArg
值,即使该函数在以后被调用时,它的this
值也不会改变。
5. 总结
call()
、apply()
和 bind()
这三个方法都可以改变函数内部的 this
指向,但它们的参数传递方式和返回结果不同。在实际使用中,可以根据需要选择合适的方法。