浅析call和apply

概述:

今天我们讲一个在咱们工作中不经常用,但是却在面试中经常被问到的方法:call方法和apply方法。

call方法:

call方法:调用一个对象的一个方法,以另一个对象替换当前对象。

调用方法:call([thisObj,obj1,obj2....])

看下面的例子:


1

2

3

4

5

6

7

8

9

10

function add(a,b)

{

    alert(a+b);

}

function sub(a,b)

{

    alert(a-b);

}

add.call(sub,3,1);//4

结果是“4”,call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 说的在直白点,上面例子中,把add放到了sub中执行,所以a+b = 4。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

apply方法的意思和call差不多,唯一的区别就是传递的参数是个数组。

调用方法:call([thisObj,[argArray]])

看下面的例子:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

function test1(name,age)

    {

        this.name=name;

        this.age=age;

    }

/*定义一个学生类*/

function test2(name,age,grade)

    {

        test1.apply(this,arguments);

        this.grade=grade;

    }

//创建一个学生类

var test3=new test2("uw3c",24,"一年级");

//测试

alert("name:"+test3.name+"\n"+"age:"+test3.age+"\n"+"grade:"+test3.grade);

大家肯定会惊奇的发现,

this:在创建对象在这个时候代表的是student
arguments:是一个数组,也就是["uw3c","24",”一年级”];
也就是通俗一点讲就是:用test3去执行test1这个类里面的内容,在test1这个类里面存在this.name等之类的语句,这样就将属性创建到了test3对象里面

什么时候用call方法、apply方法:

在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments, 这个参数是数组类型,并且在调用test1的时候参数的列表是对应一致的(也就是test1和test2的参数列表前两位是一致的) 就可以采用 apply , 如果我的test1的参数列表是这样的(age,name),而test2的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置。

时间: 2024-10-12 13:28:08

浅析call和apply的相关文章

Javascript中call、apply函数浅析

call/apply函数作用其实就是改变this的取值,有一句话是:谁调用的这个方法那方法里的this就是指谁,而有时我们会需要改变this值,所以call/apply就能派上用场. 下面我写个方法来模拟JQuery中的each方法来加深对call/apply函数的理解 代码如下: 1 function each(arr, callback) { 2 for (var i = 0; i < arr.length; i++) { 3 callback(arr[i], i, arr[i]); 4 }

浅析JavaScript中Function对象(二) 之 详解call&amp;apply

函数是js中最复杂的一块内容,其中call() 和 apply()又是重灾区,初学者往往在这个坑里栽倒,这次来分析这2个函数对象的成员 一.函数的角色 在js的体系下,js有3种角色.分别是普通函数.构造器.对象. 1.普通函数 <script type="text/javascript"> function f1(){ console.log('这是个函数'); } </script> 这里声明的f1,它的角色就是个普通函数 2.构造器 <script

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

【Spark Core】任务运行机制和Task源代码浅析1

引言 上一小节<TaskScheduler源代码与任务提交原理浅析2>介绍了Driver側将Stage进行划分.依据Executor闲置情况分发任务,终于通过DriverActor向executorActor发送任务消息. 我们要了解Executor的运行机制首先要了解Executor在Driver側的注冊过程.这篇文章先了解一下Application和Executor的注冊过程. 1. Task类及其相关 1.1 Task类 Spark将由Executor运行的Task分为ShuffleMa

【Spark Core】任务执行机制和Task源码浅析1

引言 上一小节<TaskScheduler源码与任务提交原理浅析2>介绍了Driver侧将Stage进行划分,根据Executor闲置情况分发任务,最终通过DriverActor向executorActor发送任务消息. 我们要了解Executor的执行机制首先要了解Executor在Driver侧的注册过程,这篇文章先了解一下Application和Executor的注册过程. 1. Task类及其相关 1.1 Task类 Spark将由Executor执行的Task分为ShuffleMap

SQL Server 中WITH (NOLOCK)浅析

原文:SQL Server 中WITH (NOLOCK)浅析 概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如下所示(摘自MSDN): 1: 指定允许脏读.不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻碍当前事务读取锁定数据.允许脏读可能产生较多的并发操作,但其代价是读取以后会被其他事务回滚的数据修改.这可能会使您的

React Native Android Gradle 编译流程浅析

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 前面已经发车了一篇<React Native Android 从学车到补胎和成功发车经历>,接着就该好好琢磨一下 React Native 周边了,没看第一篇的可以先去看看:这里我们先从 React Native 的 Android 编译来简单揭晓一下 React Native 在集成的过程中到底干了哪些不可告人的坏事:由于我们项目准备以 Gradle 形式接入

Gradle 庖丁解牛(构建源头源码浅析)

1 背景 陆陆续续一年多,总是有人问 Gradle 构建,总是发现很多人用 Gradle 是迷糊状态的,于是最近准备来一个"Gradle 庖丁解牛"系列,一方面作为自己的总结,一方面希望真的能达到标题所示效果,同时希望通过该系列达到珍惜彼此时间的目的,因为目前市面上关于 Gradle 的教程都是在教怎么配置和怎么编写插件,很少有说明 Gradle 自己到底是个啥玩意的,还有是如何工作的,本系列以官方 release 3.4 版本为基础. 废话不多说,标题也表明了本篇所总结的内容 --

eclipse上的git命令使用浅析

eclipse上的git命令使用浅析 2016-03-31 14:44 关于eclipse上git的安装和建立代码仓库的文章比较多,但作为一个初识git的人更希望了解每个命令的作用. 当项目连接到代码库后,我们可以在项目上右键->team进行git上的一些操作,具体怎么使用下面一步步的说明. Commit(提交): 点击会出现如下界面,commit message输入你提交的信息,一般是做了什么修改和工作,项目所有者和提交者会自动生成.下面Files选择哪些你做了修改的文件进行提交(这里注意你的