今天在群里讨论的时候,看到有人问apply怎么使用,突然想起自己刚接触这个方法的时候,也是一样的摸不着头脑。

记得当时上网看了很多讲解,可实际用的时候还是感觉有些蒙蒙哒orz....

后来想一想,也许是网上的说法有些太模式化了,让新手无法理解吧。

那今天咱们就来试试用比较通俗的方式来解析一下这个apply以及它的兄弟call。

先看看apply的定义:对象的继承、复制对象等等...

说的都对,但是对于新手来说,有些难以理解。

恩,那我们来通俗易懂的聊聊它

好 废话不多说,先上代码:

function add(){
this.a = arguments[];
this.b = arguments[];
}; function applyAdd(a , b , c){ var B={
c:c
} add.apply(B,arguments); return B } var applys=applyAdd( , , ); console.log(applys.a+applys.b+applys.c) //输出6

很简单的一个加法运算。

这个加法运算实际上做了一件什么事情呢?

首先,我们创建一类:add   这个类有两个属性:this.a   this.b

然后我们创建了另一个类:applyAdd    在这个类里我们使用了apply方法,然后给这个类定义了一个对象: B

然后我们返回这个对象。

接着给applyAdd类创建了一个新的实例:applys  请原谅我的命名比较没有创意,我说过我文笔不好嘛~~  ╮(╯▽╰)╭

好啦,我们接着看   紧接着我输出了一遍applys的applys.a+applys.b+applys.c

到这里我们要注意一下!:applys是applyAdd的实例, 但是applyAdd这个类并没有this.a和this.b! 也就是说正常来说我们这样输出应该返回NaN(undefined+undefined+3)

但是并没有,我们一样输出了6。 奥秘当然就在apply这个方法啦。

apply这个词翻译成中文是“使用”的意思。

但是我觉得这个翻译有些不太直观,我更倾向于把它叫做“抢劫”。。。

恩,既然是抢劫,首先要有一个被抢劫的倒霉蛋,还要有一个抢劫的劫匪嘛~

在这里我们的倒霉蛋自然就是add这个类啦,而劫匪就是B这个对象。

而劫匪就是apply的第一个参数:它必须要是一个对象(毕竟你不能说一串字符串是一个人嘛~)

但是这个劫匪,怎么说呢,脑子有些问题。  恩  这个体现在apply的第二个参数上:第二个参数是什么呢?是一个参数集合(一个数组)。

为什么说这个劫匪脑子有问题呢? 因为他会先给别人一些东西,然后再抢过来。。。

恩,干这种脱裤子那啥的事,不就是脑子有问题么。。。 不过没办法,计算机就是个脑子跟正常人不太一样的东西~   ╮(╯▽╰)╭

也就是说,这个时候  add里如果使用了参数,都会来自于apply第二个参数传入的东西。这里我们传入了applyAdd本身的参数进去,也就是最后传入的参数是[1,2,3]这样的一个数组。

当然,你也可以直接传一个数组[1,2,3]进去,效果是完全一样的。

然后我们在add内部把this.a和this.b用1和2来赋值,赋值完成后,还没等add乐呢,就一把抢过来~~

所以最后的实际运行过程是这样的:

function add(){
this.a = arguments[];//3. 哇!真好,竟然有人愿意给我钱~ 他一定是天使! 等等。。你要干嘛? 不要抢我的东西啊!!
this.b = arguments[]; //1.我有两个袋子,但是都是空的。谁能给我点钱呢?
}; function applyAdd(a , b , c){ var B={
c:c
} add.apply(B,arguments);//2.今天去抢劫add,不过他的两个袋子都是空的,没关系,我先给填上,然后再抢过来!哈哈哈,我真是太聪明啦~ //4. B:哈哈哈 今天抢了两个袋子!收入不错 return B } var applys=applyAdd( , , ); console.log(applys.a+applys.b+applys.c) // 5.B:数一数自己现在有多少钱! 6元!我真是太有钱了~

恩,大概就是这样一个过程 orz....

至于他的兄弟call,实际上跟apply的运行过程是完全一毛一样的,区别只在于:call的第二个参数,call实际上是可以有N个参数的,第一个参数一样是劫匪B,而后面的参数则是把apply的第二个参数从数组的形式变成了许多个独立的参数。

别如你apply里的第二个参数是[1,2,3]  但是如果使用call的话,就要改成add.call(B,1,2,3)这样的形式。

至于怎么使用它们,以及何时使用,不在今天的讨论范围之内,我们改天再聊。

来聊聊apply和call的更多相关文章

  1. 兄台息怒,关于arguments,您的想法和大神是一样一样的----闲聊JS中的apply和call

    JavaScript提供了apply和call两种调用方式来确定函数体中this的指向,表现出来的特征就是:对象可以'借用'其他对象的方法.之前的几篇博客回顾了一些Web控件的一些开发方法,我们聊了如 ...

  2. 聊聊call、apply、bind的故事

    说到call.apply.bind,前端的胖友可是不陌生.以下就从几个方面分别聊聊它们. 是什么?(what?) 实际上它们真正的样子是这样的: Function.prototype.call(thi ...

  3. 聊聊传统oo和js的某些对比——对象/函数/new关键字等

    自己的学习记录,写的短点可以以后短时间内理清一些疑惑,看前要求你至少了解js中关于原型链等基本概念,因为文章直接以总结的形式理出知识点,没有去解释一些基本的概念! 1.1.熟记两句话,预预热 1. 函 ...

  4. 直播开始:'云榨汁机'诞生记--聊聊JavaScript中的'业务建模'

    闭包是JavaScript中的一个重要特性,在之前的博文中,我们说闭包是一个'看似简单,其实很有内涵'的特性.当我们用JavaScript来实现相对复杂的业务建模时,我们可以如何利用'闭包'这个特性呢 ...

  5. 用 Function.apply() 的参数数组化来提高 JavaScript程序性能

    我们再来聊聊Function.apply() 在提升程序性能方面的技巧. 我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 aler ...

  6. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. js中apply的用法(转)

    之一------(函数的劫持与对象的复制)关于对象的继承,一般的做法是用复制法: Object.extend见protpotype.js 的实现方法: Object.extend = function ...

  8. js 中的apply

    之一------(函数的劫持与对象的复制)关于对象的继承,一般的做法是用复制法: Object.extend 见protpotype.js 的实现方法: Object.extend = functio ...

  9. pandas | 详解DataFrame中的apply与applymap方法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是pandas数据处理专题的第5篇文章,我们来聊聊pandas的一些高级运算. 在上一篇文章当中,我们介绍了panads的一些计算方法, ...

随机推荐

  1. IIS配置错误信息输出

    Asp.net: 一.通过 IIS 配置 1.打开IIS管理器,或按住 WIN + R 打开命令行输入 inetmgr 打开 IIS 管理 2.左边目录选择目标站点,在右边 IIS 块中双击 “错误页 ...

  2. C语言实现贪吃蛇源码

    先放效果 源代码 //2016-2-12 //zhaoyu //Gmail:zhaoyu1995.com@gmail.com //Language: C //Platform:Code::Blocks ...

  3. 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  4. javascript 代码可读性

    可读性的大部分内容都是和代码缩进相关的,必须保证代码有良好的格式.可读性的另一方面就是注释,一般而言,有如下一些地方需要进行注释 1.1.1 函数和方法 每个函数或方法都应该包含一个注释,描述其目的和 ...

  5. Saltstack异步执行命令(十三)

    Saltstack异步执行命令 salt执行命令有时候会有超时的问题,就是命令下发下去了,部分主机没有返回信息,这时候就很难判断命令或任务是否执行成功.因此,salt提供异步执行的功能,发出命令后立即 ...

  6. SaltStack与ZeroMQ(二)

    SaltStack与ZeroMQ SaltStack底层是基于ZeroMQ进行高效的网络通信. ZeroMQ简介 ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设 ...

  7. web中异步和同步的理解

    普通的B/S模式就是同步,而AJAX技术就是异步,当然XMLHttpReques有同步的选项. 同步:提交请求->等待服务器处理->处理完毕返回.这个期间客户端浏览器不能干任何事. 异步: ...

  8. Windows XP SP3 Professional 微软(MSDN)官方原版系统

    Windows XP SP3 Professional 微软(MSDN)官方原版系统 Windows XP(版本号:5.1,开发代号:Whistler)是微软公司推出供个人电脑使用的操作系统,其RTM ...

  9. OC面向对象特性: 继承

    基础知识 1.标识符是有字母,数字,下划线组成的. 2.首字母只能是字母,下划线,不能为数字. 3.标识符要做到见名之意. 4.标识符不能使用已定义的关键字和预定义标识符. 继承 继承:子类可以直接访 ...

  10. js字符串RTrim方法(right trim)

    String.prototype.RTrim = function (c) { if (!c) { c = ' '; } var reg = new RegExp('([' + c + ']*$)', ...