call,bind,applay都是更改this指向的
call的使用:
call在使用时直接是obj.call(this,'arg1','arg2') 不用使用“()”调用
call的传参(this, 'arg1','arg2') 直接放在后面即可
apply的使用:
apply在使用时直接是obj.apply(this,'arg1','arg2') 不用使用“()”调用
apply的传参(this, ['arg1','arg2']) 除this指向外,其余需要放在数组里传入
bind的使用:
bind在使用时直接是obj.bind(this,'arg1','arg2') 需要使用“()”调用 obj.bind(this,')() 因为bind返回的是一个新函数,需要()进行调用;
bind 的传参(this, 'arg1','arg2') 直接放在后面即可
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
call: 返回参数不是新函数, 不用() 调用,传参不用数组包装
apply: 返回参数不是新函数,不用() 调用,传参需要数组包装
bind:返回参数是新函数, 需要() 调用,传参不用数组包装
参数可传对象,字符串,等等
非严格模式:
如果不传参数,或者第一个参数是null或nudefined,this都指向window
严格模式:"use strict"
如果不传参数,或者第一个参数是null或nudefined,this都指向undefined
***
实例
***
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210719110936911.png)
obj.myFun.call(db,‘成都’,‘上海’); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.apply(db,[‘成都’,‘上海’]); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db,‘成都’,‘上海’)(); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db,[‘成都’,‘上海’])(); // 德玛 年龄 99 来自 成都, 上海去往 undefined