美文网首页js css html
JavaScript中call,apply和bind方法的区别和

JavaScript中call,apply和bind方法的区别和

作者: 扶得一人醉如苏沐晨 | 来源:发表于2023-03-08 09:14 被阅读0次

一、函数被调用默认传入的两个参数

在js中,所有的函数再被调用的时候都会默认传入两个参数
一个是this,还有一个是arguments
在默认情况下this都是指当前的调用函数的对象

但是有时候我们需要改变this的指向,也就是说使函数可以被其他对象来调用,那么我们应该怎样做呢?这时候我们就可以使用call,apply和bind方法了。

二、this指向问题

this指向 = 谁调用,指向谁(这是错误的!!!)
this永远指向最后一个调用它的那个对象(正解)
如何解决this指向问题
1.使用ES6中箭头函数
2.函数内部使用_this = this
3.使用apply,call,bind方法
4.new实例化一个对象

三、call,apply和bind方法的来历

在js中所有的函数都是Function的实例,而且对于Function来说,它的原型即Function.prototype中含有很多东西,其中call,apply和bind方法就是Function原型中的方法,所以根据原型的规则,所有的函数都可以使用原型中属性和方法,所以来说,对于所有的函数都可以使用call,apply和bind方法。

四、call,apply和bind方法的区别

1、call、apply与bind都用于改变 this 绑定
2、call、apply 在改变 this 指向的同时还会执行函数,一次性的。
不同的是 call方法传递函数调用形参是以散列形式,
而 apply 方法的形参是一个数组。
在传参的情况下,call的性能要高于 apply,
因为 apply 在执行时还要多一步解析数组。
3、bind 在改变 this 后是返回一个全新的绑定函数,即返回一个新的函数,
不直接执行函数。并且此后 this 的指向无法再次通过 call、apply、bind 改变。

五、call

使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数

function.call(thisArg, arg1, arg2, ...)

[thisArg] 必选的,但是你也可以不写,
但是不写,那你用这个方法还有什么意义?
指定为 null 或 undefined 时会自动替换为指向全局对象
[arg1, arg2, ...] 参数列表

5.1.例子


let objCall ={
    name: "我是 Call"
}


function fn() {
    console.log('参数 => ', ...arguments)
    console.log('name => ', this.name)
}

fn.call(objCall , 1,2,3)

// 参数 =>  1 2 3
// name =>  我是Call

六、apply

调用一个具有给定 this 值的函数,以及以一个数组(或类数组对象)的形式提供的参数

func.apply(thisArg, [argsArray])
[thisArg] 必选的 同 call 一样
[argsArray] 可选的

6.1、例子

let objApply ={
    name: "我是 Apply"
}
function fn() {
    console.log('参数 => ', ...arguments)
    console.log('name => ', this.name)
}
fn.apply(objApply, [1,2,3])
// 参数 =>  1 2 3
// name =>  我是 Apply

七、bind

创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

function.bind(thisArg,arg1,arg2,arg3,....)

7.1、例子

let objBind ={
    name: "我是 Bind"
}
let objApply ={
    name: "我是 Apply"
}

function fn() {
    console.log('参数 => ', ...arguments)
    console.log('name => ', this.name)
}
let bfn = fn.bind(objBind, 1,2,3);
//需要自己主动执行
bfn();
// 参数 =>  1 2 3
// name =>  我是 Bind

相关文章

网友评论

    本文标题:JavaScript中call,apply和bind方法的区别和

    本文链接:https://www.haomeiwen.com/subject/llouldtx.html