JavaScript之apply、call详解--前端面试准备

JavaScript之apply、call

二者详解

apply

  • 语法:
    functionObject.apply( [ thisObj [, argsArray ]] )
  • 解释:
    apply()函数用于调用当前函数functionObject,并可同时使用指定对象thisObj作为本次函数执行时函数内部的this指针引用。
    该函数属于Function对象,所有主流浏览器均支持该函数。
  • 参数描述:
参数描述
thisObj可选/Object类型指定执行functionObject函数时,函数内部this指针引用的对象。
argsArray可选/Array或是argumens对象
  • 返回值
    apply()方法的返回值为任意类型,其返回值取决于当前functionObject对象的返回值。

call

  • 语法:
    functionObject.call( [ thisObj [, arg1 [, arg2 [, args...]]]] )
    与apply不同之处在于:call是将Function对象的参数一个个分别传入,apply是以一个数组/arguments对象传入。
  • 解释:
    call()函数用于调用当前函数functionObject,并可同时使用指定对象thisObj作为本次执行时functionObject函数内部的this指针引用。
    该函数属于Function对象,所有主流浏览器均支持该函数。
  • 参数描述:
参数描述
thisObj可选/Object类型指定执行functionObject函数时,函数内部this指针引用的对象。
arg1…args可选/任意类型
  • 返回值
    call()方法的返回值为任意类型,其返回值取决于当前functionObject对象的返回值。

示例&说明

//观察apply和call对this的影响
//
//
var name = "yww";
var age = 20;
function test(){
    document.writeln(this);
    document.writeln(this.name);
    document.writeln(this.age);     
};
test();//=>[object Window] yww 20
//var关键字声明的全局作用域变量属于 window 对象
var wkx={
    name:'wkx',
    age:20
};
test.apply(wkx);//=>[object Object] wkx 20
test.call(wkx);//=>[object Object] wkx 20
//可以观察到this改变了,不再是默认的window了。

//观察apply和call传递参数的情况
//
//
function Student(major,grade){
    this.major=major;
    this.grade=grade;
};
    
function wkx(major,grade,habit){
    Student.apply(this,arguments);
    this.habit=habit;
}
    
function yww(major,grade,habit){
    Student.call(this,major,grade);
    this.habit=habit;
}
var xx=new wkx('cs','junior','study');
var yy=new yww('cs','junior','eat&sleep');
document.writeln(xx.major+'\n'+xx.grade+'\n'+xx.habit);
//=>cs junior study
document.writeln(yy.major+'\n'+yy.grade+'\n'+yy.habit);
//=>cs junior eat&sleep
//哇!我一开始也觉得很神奇,明明xx没有major和grade属性呀!怎么可以输出呢
//后来思考了哈,发觉是在使用apply/call的时候,Student函数里的this已经改变啦!已经变成了调用wkx函数的xx了!所以Student函数里的操作相当于就给xx增加了属性major和grade

参考文献1-apply、call、bind
参考文献2-apply
参考文献3-call

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值