纠结的函数调用

本文通过一个具体示例,解析了JavaScript中call与apply方法的区别及使用技巧,展示了如何利用这两种方法来灵活调整函数调用时的上下文和参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看到一段代码,把call 和 apply 一起调用,让我琢磨的大半天:


function Foo() {}

Foo.prototype.method = function(a, b, c) {
console.log(this, a, b, c);
};

// Create an unbound version of "method"
// 输入参数为: this, arg1, arg2...argN
Foo.method2 = function() {

// 结果: Foo.prototype.method.call(this, arg1, arg2... argN)
Function.call.apply(Foo.prototype.method, arguments);
};

//上面的Foo.method2 等效于下面的代码:

Foo.method2 = function() {

var args = Array.prototype.slice.call(arguments);
Foo.prototype.method.apply(args[0], args.slice(1));
};


//example:
Foo.method2({"a":33},1,2,3)
// output: Object { a=33} 1 2 3
// 可以看到: this指向了 对象 {"a":33},而剩下的参数正好传递给method了。

结论:
1. apply方法,会自动把arguments这个伪数组,解构,传递给 call方法。
2. 我们知道,call的调用方法是:fn.call(obj,args1,args2,...),而 Foo.prototype.method 将会利用call方法得到执行。
3.传递给 Foo.method2 的 arguments[0],相当于call参数的 obj,而 arguments的后续参数,将逐个按次序,传递给 Foo.prototype.method
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值