Javascript中上下文调用粗浅理解

研究了好几天javascript,下面是我对javascript中上下文调用语法的一些粗浅理解
上下文语法中有两个方法,其中一个是apply(),一个是call(),这个两个方法的作用相同,都可以改变函数中this指代的对象,但是用法不同。
为什么要用这两种方法呢?
嘿嘿,当然是为了方便了。用这两个方法的作用有点像借花献佛一样,这样说可能有点抽象,就比如说A想执行一个方法,可是A里面没有这个方法,那怎么办呢,这个时候这两个方法就来了,他们可以把别的里面的方法借给A,让他满足自己的心愿去用这个方法。这样说就好理解了吧。
那么怎么用这两个方法呢
是这样用的:
apply()
函数名.apply(对象, [参数]);
call()
函数名.call(对象, 参数);
由此可见:call传参数时,传的参数就是一一列举的,而apply第二个参数必须为一个数组,就是把参数放在数组里面。
注意:1.call()和apply()方法里面如果没有传对象,那么默认是全局对象
2.如果函数或方法中没有this的操作, 那么无论什么调用其实都一样
3.在使用apply和call的时候,默认的this都会失效,this的值由apply和call的第一个参数决定

小例子来吧
例子1.
var obj={
name:“yandong”,
age:“88”,
old:function(){
console.log(this.name+“年龄已经”+this.age); }
}
var obj2={
name:“jiajia”,
age:“20”
}
obj.old.call(obj2);
obj.old.apply(obj2);

eg:这个例子是一个非常简单的例子,相信聪明的你一定看出来了,没错这个例子输出的就是两个jiajia年龄已经20 由此可见apply()和call()在不传参数情况下的使用是一样的

例子2
var shuzi=[1,2,3,4,5,6,7,8,9,10];
var max=Math.max.apply(null,shuzi);
console.log(max);
eg:这是一个非常简单的例子,求这个数组的最大值,我选择用的是apply方法,果然结果为10,其实这个例子就是用apply接收数组,而没有第一个参数,其实这个参数可以像我一样写成null或者空字符串,相当于 this 默认为 window

例子3实现继承
function school(student){
this.student=student;
this.teacher=function(){
console.log(this.student+" is good");
}
}
function Person(student){
school.call(this,student);
}
var chengcheng=new Person(“chengcheng”) chengcheng.teacher();
eg:你们猜猜这个例子输出的什么呢?嘻嘻 答对了 输出的是chengcheng is good,其实这个例子不难理解,其中的school.call(this,student);就是使用school对象代替this,这样Person就相当于继承的school,Person里面就有了school中所有的方法和属性了

例子4

function school1(){
this.teacher1=function(){
console.log(“chengcheng is good”);
}
}
function school2(){
this.teacher2=function(){
alert(“jiajia is bad”);
}
}
function school3(student){
school1.call(this);
school2.call(this);
}
var p=new school3();
p.teacher1();
alert(p.teacher2());
eg:看了这个例子,你能想到输出结果是什么吗,没错的,控制台输出的是chengcheng is good,而网页弹出来jiajia is bad
这是为什么呢?其实这就是多重继承,school3继承了school1和school2的方法和属性

例子5 真伪数组转换

var obj={length:4,0:“ch”,1:“yandong”,2:“chengcheng”,3:“jiajia”} var arr=[];
[].push.apply(arr,obj);
console.log(arr);

eg:这个例子中,obj是一个伪数组,但是用apply方法可以很好地把伪数组转换成真数组,并且真数组里面没有length了,这是个很简单的例子,但是可以看出上下文调用真的很好用

什么时候用apply(),什么时候用call()
这个就好说了,看传的参数的形式选择呗
如果是arguments或者是数组,那就用apply()呗
否则就用call()呗

总之,上下文调用真的很方便,如果我有理解不到位的地方,望指出。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值