【js】call,apply,bind的区别

这篇博客详细介绍了JavaScript中改变函数this指向的三种方法:call、apply和bind。它们都能设置函数的上下文,但参数传递方式不同。call接受多个参数,apply接受一个数组作为参数,bind则创建绑定上下文的新函数,不立即调用。通过示例展示了如何使用这些方法,并给出了运行结果。
摘要由CSDN通过智能技术生成

call,apply,bind

  • 三者均用于改变function的this指向,但是接收参数有所不同

call

接收的第一个参数是改变this指向的目标对象,后面可接多个参数,是调用call方法的函数的参数

apply

接收的第一个参数是改变this指向的目标对象,后面只能接一个对象,给调用call方法的函数传递的参数要以数组的形式

bind

传递的参数与call一致,唯一的区别是调用的方式,bind方法绑定this成功后并不会直接调用方法,而是需要手动调用

call,apply,bind的区别

callapplybind
绑定this后立即调用方法立即调用方法需要手动调用
第一个参数需要绑定this的目标对象需要绑定this的目标对象需要绑定this的目标对象
其余的参数多个参数,以列表的形式传递一个参数,以数组的方式传递多个参数,一列表的形式传递
function f(...params) {
    console.log(this.a + ' ' + this.b + ' ' + this.c + ' ' + this.d, "参数", ...params)
}
var obj = {
    a: 1,
    b: 2,
    params: 1
}
var o1 = {
    c: 666
}
var o2 = {
    d: "ddd"
}

console.log('--------call------')
f()
f.call(obj)
f.call(o2)
f.call(obj, [o1.c, o2.d]) //[o1.c, o2.d]实际相当于一个参数 将f方法的this绑定到obj上,对f方法传递一个[o1.c,o2.c]的参数
f.call(obj, o1.c, o2.d) // 将f方法的this绑定到obj上,并对方法传递两个参数 o1.c 和 o2.d

console.log('------apply--------')
f()
f.apply(obj)
f.apply(obj, o1, o2) //这个方法就是错的,所以成功的只有绑定的this,后面传递的参数并没有成功
f.apply(obj, [o1, o2]) // 正确的调用方法
console.log('-------bind-------')
f()
f.bind(obj)()
f.bind(obj, o1, o2)()
f.bind(obj, [o1, o2])()

以下是运行结果:

--------call------
undefined undefined undefined undefined 参数
1 2 undefined undefined 参数
undefined undefined undefined ddd 参数
1 2 undefined undefined 参数 [ 666, ‘ddd’ ]
1 2 undefined undefined 参数 666 ddd
------apply--------
undefined undefined undefined undefined 参数
1 2 undefined undefined 参数
1 2 undefined undefined 参数
1 2 undefined undefined 参数 { c: 666 } { d: ‘ddd’ }
-------bind-------
undefined undefined undefined undefined 参数
1 2 undefined undefined 参数
1 2 undefined undefined 参数 { c: 666 } { d: ‘ddd’ }
1 2 undefined undefined 参数 [ { c: 666 }, { d: ‘ddd’ } ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值