关于call—apply—bind的用法和区别

因为三者的作用都是为了改变this的指向问题,所以不得不进行一下this铺垫了。

1、在浏览器里,在全局范围内this 指向window对象;
2、在函数中,this永远指向最后调用他的那个对象;
3、构造函数中,this指向new出来的那个新的对象;
4、call、apply、bind中的this被强绑定在指定的那个对象上;
5、在定时器中,this一般指向window对象;
6、箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;
7、apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。

在这里插入图片描述

三者的使用区别:

都是用来改变函数的this对象的指向的;
call() vs apply() 不同点:在于第二个参数,call第二个参数是一个一个的数据,apply第二个参数是数组;
共同点:将this指向第一个参数;
bind: bind只修改this指向,需要加()才能执行;
bind与apply、call最大的区别就是:bind不会立即调用,其他两个会立即调用。

一、call

当前实例(函数fn)通过原型链的查找机制,找到function.prototype上的call方法,function call(){[native code]};
把找到的call方法执行
当call方法执行的时候,内部处理了一些事情
1.首先把要操作的函数中的this关键字变为call方法第一个传递的实参
2.把call方法第二个及之后的实参获取到
3.把要操作的函数执行,并且把第二个以后传递进来的实参传递给函数

fn.call([this],[param]...)
call中的细节:
1、非严格模式:

如果不传参数,或者第一个参数是null或undefined,this都指向window
在这里插入图片描述

2、严格模式:

第一个参数是谁,this就指向谁,包括null和undefined,如果不传参数this就是undefined
在这里插入图片描述

二、apply

apply:和call基本上一致,唯一区别在于传参方式
apply把需要传递给fn的参数放到一个数组(或者类数组)中传递进去,虽然写的是一个数组,但是也相当于给fn一个个的传递
在这里插入图片描述

三、bind

bind:语法和call一模一样,区别在于立即执行还是等待执行,bind不兼容IE6~8
在这里插入图片描述
this改变为obj了,但是绑定的时候立即执行,当触发点击事件的时候执行的是fn的返回值undefined

document.onclick = fn.call(obj);

bind会把fn中的this预处理为obj,此时fn没有执行,当点击的时候才会把fn执行

document.onclick = fn.bind(obj);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值