javascript之call 、apply

想成为一名合格的前端开发工程师,拥有扎实的js基础是必须的,今天我们来聊聊call和apply,掌握这两个知识点的是成为一个前端大神(嘎嘎,对的,每个人都要像大神这个目标靠近哦)所必须掌握的技能。

一、什么是call和apply

概念:

call:调用一个对象的一个方法,以另一个对象替换当前对象。
apply:应用某一对象的一个方法,用另一个对象替换当前对象。
从概念上两者的功能是一样的,只是用法上会存在一点点区别,下面我会用实列进行详细讲解

用法

call

语法: call([this,arg1,arg2,arg3...argn),其中this为你想使用的对象,后面arg1,arg2..等为传入的参数
用法:该方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数或者传值为null,那么 Global 对象被用作 thisObj 。

apply

语法:apply([this,[arg1,arg2,arg3...argn]),其中this为你想使用的对象,后面[arg1,arg2..]这个数组为传入的参数
用法:该方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

两者的区别

apply和call的区别仅仅是传参的类型不一样,call是有多少参数都分开一个一个传入,而apply是将需要传入的参数放到一个数组中

代码演示

function  Car1(age,name,color){//定义一个类
   this.age = age;
   this.name = name;
   this.color= color;
}
//定义另一个类
function Car2(age,name,color,width,height){
//传统做法
this.age = age;
this.name =name;
this.color = color;
this.width = width;
this.height = height;
}
var car = new Car2(18,'xiaoming','red',20,30);

这样car对象就会拥有age.name,color,width,height这几个属性,但是大家有木有发现Car1中的属性Car2中都有,那可不可以将Car2进行精简。。。
对Car2代码进行改写(使用call和apply),看下图

1.png
2.png

注:以下只对call进行讲解
效果是一样的,car2完美的找到了自己的对象(嘿嘿,一个都不少),毫无疑问call起到了关键的作用,我们来分析这个过程,看看call进行了什么操作。
Car1.call(this,age,name,color);根据上述提到的概念:call方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
将实列中的参数和概念对号入座: 函数对象=>Car1 ;this=>car2(this指的是函数的调用者,此语境下为car2);这样一分析就能看出来此刻call的作用就是把Car1函数中的的this替换为对象car2,代码等价为tcar1.age = age;car1.name = name; car1.color = color;
详细流程:执行到new操作符的时候,程序就进入到Car2构造函数内部,此时的this是一个空对象{}, 执行到call这步骤时,就进入到Car1构造函数的执行上下文中,将Car1中的this替换为这个空对象 ,Car1内执行完之后这个空对象就有了Car1构造函数中的全部属性,然后进入Car2执行上下文中继续往下执行,继续给这个对象添加属性,执行完毕后在将这个对象返回出去,这时car对象正式完成创建````
在补充一下:call后面的参数就是age,name,color

二、使用的场景

讲完概念和基本用法,但是这么一个好用切重要的技术栈该用在什么地方了。
刚刚我们上面所说的,其实就是call的一个功能就是实现继承,看jquery中的一段源码

 toArray: function() {
      return slice.call( this );
},

其实toArry就是继承了slice里面的方法,一般用call来改变执行上下文中的this来达到继承相同的功能。

再来看一个比较常见的例子
3.png

arguments定义:在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们.(w3c);

看上图的结果,arguments和数组基本上一样,我们可以按照索引取到对应的值也可以访问arguments.length.

arguments[0] = 'aa';
arguments.lenght = 3;
arguments.push(6);//报语法错误,arguments.push 不是一个函数
arguments.slice(1);//报语法错误,arguments.slice不是一个函数
arguments instanceof Array  // fasle 
//说明arguments不属于数组,所以数组所拥有的一些方法,并不试用arguments ,那如果我想实现这种功能改如何了,这时call或者apply就派上用场了,看下面代码
var array = [];// 等价于 var array = new Array();
function  Demo(a,b,c){
   array.push.call(arguments,'dd','ff');//Array.prototype.push.call(arguments,'dd','ff');原理也是一样的
  console.log(arguments );

}
var demo = new Demo("aa","bb","cc");
//结果
arguments  = ["aa", "bb", "cc", "dd", "ff"]

apply由于传参为数组,所以还有其他的一些灵活用法。。。我会在之后补上这些案列 和一些好的框架中用到这块的代码,贴出来和大家一起分享

什么时候使用apply和call?

两者的功能一样,只是传入的参数形式不一样,这样就需要根据特定的项目需求来进行选择。比如需要传的参数太多,那么我可以先用一个数组来作为容器,选择apply来完成,或者本来的参数就包含在数组中我也可以采用apply,大部分情况下使用call即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容