当前位置:网站首页>call,apply,bind指定函数的this指向详解,功能细节,严格和非严格模式下设定this指向
call,apply,bind指定函数的this指向详解,功能细节,严格和非严格模式下设定this指向
2022-08-10 23:22:00 【勇敢*牛牛】
function fn(a,b){
console.log("aaa");
}
1、call、apply会执行函数
fn.call();
fn.apply();
2、call、apply执行函数的时候将函数里的this改变为带入的第一个参数
var o={
a:1};
fn.call(o);
fn.apply(o);
3、call,调用是第一个参数是替代函数中this的指向,第二个参数开始是原函数中所有参数顺序填入
apply一共就有两个参数,第一个参数时替代函数中this的指向,第二个参数是一个数组,里面时所有向原函数中传入的参数
fn.call(o,1,2);
fn.apply(o,[1,2]);
function sum(){
var sum=0;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
var s= sum(1,2,3,4,5,6,7);
console.log(s)
var arr=[1,2,3,4,5,6,7];
var s=sum.apply(null,arr);
console.log(s)
call,apply 会执行这个函数
4、回调函数是滞后执行的,但是call,apply会立即执行函数
回调函数想要改变this指向不能使用call和apply
setInterval(fn.call(o),1000);
5、bind 在执行函数之前,先使用bind绑定函数中的this指向,并且返回一个新
的函数
这个函数的内容与原函数内容一样,但是其中this被改变指向为bind绑定的对象,因为bind不会立即执行,所以可以改变回调函数的this指向
function abc(a,b,c,d){
console.log(a,b,c,d);
}
var f=abc.bind(null,1,2);
f(3,4);
f(5,6)
事件函数使用bind需要注意这个绑定后会返回一个新的函数
var o={
b:1,
a:function(){
this.handler = this.clickhandler.bind(this);
document.addEventListener("click",this.handler);
},
clickhandler:function(e){
console.log("被点击了");
console.log(this);
document.removeEventListener("click",this.handler);
}
}
o.a();
bind还具备优先将前多少为参数带入
在后续的执行该新函数时,不需要重新带入这两个参数,后续带入的参数则按原位数参数后的位置带入
bind是es5的属性,箭头函数是es6的,所以不能在箭头函数上使用这个。
//一种写法
function fn(a,b,c,d){
console.log(this,a,b,c,d)
}
fn.bind({
a:1},1,2)(3,4);
如果给入call和apply,bind的指向this对象不是对象,会发生什么
var o={
a:1,
b:function(){
console.log(this)
}
}
非严格模式时
fn.call(1);//this指向对象1 所有数值,字符串,布尔值都会被转换为相对于的对象类型,然后this指向这个对象类型
o.b.call(undefined);//this指向window 参数为undefined或者不填的时候this指向window
o.b.call(null);//this指向window 参数为null的时候this指向window
o.b();//this就是o
严格模式时
使用严格模式时,call,apply、bind调用带入什么参数时,this就指向这个参数
o.b.call(1);
o.b.call();
o.b.call(null)
var f=o.b.bind(null);
f();
边栏推荐
猜你喜欢
随机推荐
安科瑞为工业能效行动计划提供EMS解决方案-Susie 周
数组 冒泡排序
大厂社招:Android 高级工程师的面试题,你知道多少?
Android面试冲刺:2022全新面试题——剑指Offer(备战金九银十)
如何反弹shell
实例052:按位或
使用方便、易于集成、可扩展的用于物流运输行业的文档管理软件
实例055:按位取反
国内vr虚拟全景技术领先的公司
二叉树 | 迭代遍历 | leecode刷题笔记
数学建模准备知识
生态伙伴开发实践 | 智慧检测实验室应用系统快速接入指令集数字底座
性能不够,机器来凑;jvm调优实战操作详解
Pytorch面试题面经
HGAME 2022 复盘 writeup
CSAPP lab0 实验环境搭建
响应式pbootcms模板运动健身类网站
基于深度学习的三维点云分割综述
MUI框架开发app中出现的问题
开源一夏|OpenHarmony如何选择图片在Image组件上显示(eTS)