灏天阁

使用 call 和 apply 调用

· Yin灏

callapplyFunction 的原型方法,它们能够将特定函数当做一个方法绑定到指定对象上,并【同时】进行调用。

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 对象的一个方法,并把包含多个值的传递给它。
*/

也可以动态的调用 Mathmax() 方法来计算最大值元素。

/*
 * 调用 apply 可以改变传参的数据类型。
 **/
var a = [23, 45, 2, 46, 63, 45, 56, 63];
var m = Math.max.apply(null, a);
console.log(m);

使用 callapply 方法可以把一个函数转换为指定对象的方法,并在这个对象上调用该方法。当函数动态调用之后,这个对象的临时方法也就不存在了。

function f() {
    return "函数f";
}
var obj = {};
console.log(f.call(obj)); // 函数f
console.log(obj.f()); // 报错,f 函数的绑定关系已被销毁

call 和 apply 方法的主要功能如下:

  • 调用函数
  • 修改函数体内的 this 指代的对象
  • 为对象绑定方法
  • 跨越限制调用不同类型的参数

- Book Lists -