简说 call() 、apply() 、bind()

本文深入解析JavaScript中call(), apply()和bind()三种函数调用方式的特点与应用。通过实例展示如何使用这些方法改变函数的上下文环境,以及bind()如何实现函数绑定和柯里化,帮助读者掌握更灵活的函数调用技巧。

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

对于这三个方法,我想一部分人还是比较陌生的。

所以今天来个简单的介绍~

我们可以将call()和apply()看作是某个对象的方法,通过调用方法的形式来间接调用函数。call()和apply()的第一个实参是要调用函数的母对象,在函数体内通过this来获得他的引用。

简单例子:

function test(){
    return this.x + this.y;
}
var o = {x:1,y:2};
console.log(test.call(o));
console.log(test.apply(o));

 

对于call()来说,第一个调用上下文实参之后的所有实参就是要传入待调用函数的值。

对于apply()来说,它的实参都放入一个数组当中。

例:

function test(x,y){
    return x + y;
}
console.log(test.call(this,1,2));
console.log(test.apply(this,[2,3]));

我想经过这两个例子,对于call()和apply()这两个方法,应该有个简单的理解了吧。

 

bind():主要作用就是将函数绑定至某个对象。如下例所示,当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新的函数。 调用新的函数将会把原始的函数f()当做o的方法来调用。传入新函数的任何实参都将传入原始函数

function f(y){return this.x+y}
var o = {x:1};
var g = f.bind(o);
g(2) // =>3

在ECMAScript 5中的bind()方法不仅仅是将函数绑定至某一个对象,它还附带一些其他作用:除了第一个实参之外,传入bind()的实参也会绑定至this,这个附带的应用是一种常见的函数式编程技术,有时也被称为"柯里化"(哇塞,柯里化,听起来很高大上的赶脚~)

var sum = function(x,y){return x + y}; //返回两个实参的和值
//创建一个类似sum的新函数,但this的值绑定到null
//并且第一个参数绑定到1,这个新的函数期望只传入一个实参
var succ = sum.bind(null,1);
succ(2) //=>3 :x绑定到1,并传入2作为实参y
function f(y,z){return this.x + y +z}; //另外一个做累加计算的函数
var g = f.bind({x:1},2);
g(3)  // = >6: this.x绑定到1,y绑定到2,z绑定到3

OK 就先介绍到这里~

转载于:https://www.cnblogs.com/showtime813/p/4466105.html

`call()`, `apply()`, 和 `bind()` 都是 JavaScript 中用于函数操作的重要方法,它们的主要目的是改变函数的执行上下文或传递参数的方式: 1. **call()**: 这个方法接收两个参数,第一个是要修改为的新上下文(this),第二个是一个数组或者点表示法的对象和剩余参数列表。它会设置这个新上下文,并按顺序传递给函数。 ```javascript function sayHello(name) { console.log(`Hello, ${name}!`); } sayHello.call({ name: 'John' }); // 输出 "Hello, John!" ``` 2. **apply()**: 类似于 `call()`, 但是接受两个参数,一个是上下文,另一个是一个数组,所有参数作为单独元素放入数组。这样可以更方便地一次性传递多个参数。 ```javascript sayHello.apply(null, ['Alice', 42]); // 输出 "Hello, Alice!" ``` 3. **bind()**: 返回一个新的函数,它的 `this` 被绑定到提供的上下文中,并且预先设置了部分参数。当这个新的函数被调用时,不会改变 `this`,但保留了被绑定的参数。 ```javascript const boundSayHello = sayHello.bind({ name: 'Charlie' }); boundSayHello(); // 输出 "Hello, Charlie!" ``` **异同点**: - `call()` 和 `apply()` 主要区别在于传递参数的方式,`apply()` 提供了一个数组来批量传递。 - `bind()` 则侧重于创建一个新的函数实例,保持其初始 `this` 的不变,适合需要固定 `this` 的场景。 - `call()` 和 `apply()` 可以立即改变函数的行为,而 `bind()` 创建的是一个新的函数,原函数本身并没有变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值