使用 call 和 apply 调用
·
Yin灏
call
和 apply
是 Function
的原型方法,它们能够将特定函数当做一个方法绑定到指定对象上,并【同时】进行调用。
function.call(thisobj, args...)
function.apply(thisobj, [args]);
function
表示要调用的函数thisobj
表示绑定对象,即this
指代的对象args
表示要传递给被调用函数的参数call
方法可以接收多个参数列表,apply
只能接收一个数组或伪数组
下面示例使用 call
动态调用函数 f
,并传入 3 和 4
function f(x,y) {
return x + y;
}
console.log(f.call(null, 3, 4)); // 7
/*
通过 call 方法把函数 f 绑定到空对象 null 身上,以实现动态调用函数 f,同时把参数 3 和 4 传递给函数 f。
f.call(null, 3, 4) 等价于 null.m(3,4)
*/
// 使用 apply 方法来调用函数 f
function f(x,y) {
return x + y;
}
console.log(f.apply(null, [3, 4]));
使用 apply
设计一个求最大值的函数
function max() {
var m = Number.NEGATIVE_INFINITY; // 声明一个负无穷大的数值
//console.log(m); // -Infinity
for(var i = 0; i < arguments.length; i++) {
if(arguments[i] > m) {
m = arguments[i];
}
}
return m;
}
// console.log(max(3,4));
var a = [23, 45, 2, 46, 63, 45, 56, 63];
var m = max.apply(Object, a); // null
console.log(m); // 63
/*
通过 apply 方法动态调用 max() 函数,然后把它绑定为 Object 对象的一个方法,并把包含多个值的传递给它。
*/
也可以动态的调用 Math
的 max()
方法来计算最大值元素。
/*
* 调用 apply 可以改变传参的数据类型。
**/
var a = [23, 45, 2, 46, 63, 45, 56, 63];
var m = Math.max.apply(null, a);
console.log(m);
使用 call
和 apply
方法可以把一个函数转换为指定对象的方法,并在这个对象上调用该方法。当函数动态调用之后,这个对象的临时方法也就不存在了。
function f() {
return "函数f";
}
var obj = {};
console.log(f.call(obj)); // 函数f
console.log(obj.f()); // 报错,f 函数的绑定关系已被销毁
call 和 apply 方法的主要功能如下:
- 调用函数
- 修改函数体内的 this 指代的对象
- 为对象绑定方法
- 跨越限制调用不同类型的参数