1、call和apply的定义和区别

  call和apply的作用一样,唯一不同的是:接受的参数不同。

  apply:方法能够劫持另一个对象的方法,继承另一个对象的属性。

  Funciton.apply(obj,arguments)

  obj:对象,替代Function类里面的this对象

  arguments:数组

  call的用法:

  Function.call(obj,[param1[,param2[,....,param3]]]

  obj:Function类里面的this对象

  params:参数列表

2、call和apply的用法示例

  //定义一个Animal的类

  function Animal(name,age){

    this.name = name;

    this.age = age;

  }

  //定义一个Cat的类

  function Cat(name,age,kind){

    Animal.apply(this,arguments);  //调用Animal的方法,并将里面的this对象,转化成Cat实例

    this.kind = kind;

  }

  var cat = new Cat("miao",8,"cat");

  call示例,将上面代码变成Animal.call(this,name,age);其他的保持不变,这就是差别。

3、 什么情况下用apply,什么情况下用call

  在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,

  并且在调用Animal的时候参数的列表是对应一致的(也就是Animal和Cat的参数列表前两位是一致的) 就可以采用 apply ,

   如果我的Animal的参数列表是这样的(age,name),而Cat的参数列表是(name,age,kind),这样就可以用call来实现了,

  也就是直接指定参数列表对应值的位置(Person.call(this,age,name,kind));

4、 巧用apply 

  apply的一些其他巧妙用法 通过以上示例可以看出apply可以将一个数组默默的解析成一个一个的参数,

  可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) ,

  利用aplly这个特点我们就可以用在一些针对字符串操作的方法了:例如:

  a) Math.max 可以实现得到数组中最大的一项

    因为Math.max参数不支持数组,但是支持Math.max(param1,param2,parma3,....)
  所以var max = Math.max.apply(null,arrary),就可以轻易得到一个数组中最大的一项。
 
     b)Array.prototype.push 可以实现两个数组的合并

  var arr1 = new Array(1,2,3,5,6); 
  var arr2 = new Array(7,8,9,0); 
  Array.prototype.push.apply(arr1,arr2);
  console.log(arr1); // [1, 2, 3, 5, 6, 7, 8, 9, 0]

5、bind方法:绑定函数内部的this

  末尾略微提一下bind方法,是ES5新出的,它主要是绑定函数内部的this,示例

  window.color = "red";
  var o = { color: "blue" };
  function sayColor(){
    alert(this.color);
  }
  var objectSayColor = sayColor.bind(o);
  objectSayColor();  //blue

  将this绑定在o对象上,改变函数内部的this指向。

  支持bind()方法的浏览器有 IE9+、Firefox 4+、Safari 5.1+、Opera 12+、 Chrome。

参考链接:

   http://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html

     https://segmentfault.com/a/1190000004159030

JavaScript的函数call和apply的区别、以及bind方法的更多相关文章

  1. js函数中的apply()、call()、bind()方法

    ECMAScript中的函数是对象,因此函数也有属性和方法.每个函数都包含两个属性:length和prototype,且每个函数包含两个非继承而来的方法apply()和call().这两个方法的用途都 ...

  2. javascript的函数、创建对象、封装、属性和方法、继承

    转自原文javascript的函数.创建对象.封装.属性和方法.继承 一,function 从一开始接触到js就感觉好灵活,每个人的写法都不一样,比如一个function就有N种写法 如:functi ...

  3. 使用JS简单实现一下apply、call和bind方法

    使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...

  4. JavaScript学习点滴 call、apply的区别

    对于apply和call两者在作用上是相同的,但两者在参数上有区别的.     1.call call 方法 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1 ...

  5. 《JavaScript总结》apply、call和bind方法

    在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...

  6. JavaScript之函数,词法分析,内置对象和方法

    函数 函数定义 JavaScript中的函数和Python中的非常类似,只是定义方式有点区别. // 普通函数定义 function f1() { console.log("Hello wo ...

  7. JavaScript中函数对象和对象的区别

    function Test (word) { console.log (word); } Test('哈哈,我是函数'); new Test('哈哈,我是对象'); //将以上的调用方式换种通俗易懂的 ...

  8. apply、call、bind方法调用

    ---恢复内容开始--- 首先这三个方法的作用都是用来改变this的值,而this的值一般有几种情况. 1.函数作为一个对象的一个方法来调用,此时this的值指向对象. var a={ v:0; f: ...

  9. this指向和apply,call,bind三者的区别

    一.前言 this指向,apply,call,bind的区别是一个经典的面试问题,同时在项目中会经常使用到的原生的js方法.同时也是ES5中的众多坑的一个.ES6中可能会极大的避免了this产生的错误 ...

随机推荐

  1. 项目1:ATM+购物商城项目

    项目1:ATM+购物商城 1.项目介绍 项目需求: # 项目需求如下:'''- 额度 15000或自定义​- 实现购物商城,买东西加入购物车,调用信用卡接口结账​- 可以提现,手续费5%​- 支持多账 ...

  2. JavaWeb中的监听器

    JavaWeb中的监听器 l  事件源:三大域! ServletContext ¨       生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时 ...

  3. snmpwalk 简介

    概述 SNMPWALK是一个通过SNMP GET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作. 命令⾏ snmpwalk [选项] agent [oid] ...

  4. db服务器参数优化

    1.swap分区 swap作用是在系统内存不够的情况下,当做临时的内存使用. swap是在硬盘上,性能肯定没有再内存好,当系统内存使用超过40%的时候, swap会可能被使用,而系统一旦使用swap会 ...

  5. 每日一问:你了解 Java 虚拟机结构么?

    对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...

  6. react + node + express + ant + mongodb 的简洁兼时尚的博客网站

    前言 此项目是用于构建博客网站的,由三部分组成,包含前台展示.管理后台和后端. 此项目是基于 react + node + express + ant + mongodb 的,项目已经开源,项目地址在 ...

  7. linux 自动化安装系统 -KS文件

    # Kickstart file automatically generated by anaconda. installharddrive --partition=sdb2 --dir=lang e ...

  8. 【RabbitMQ学习之二】RabbitMQ四种交换机模式应用

    环境 win7 rabbitmq-server-3.7.17 Erlang 22.1 一.概念1.队列队列用于临时存储消息和转发消息.队列类型有两种,即时队列和延时队列. 即时队列:队列中的消息会被立 ...

  9. USDT

    如果刚刚接触比特币,你可能会看到USDT并把它误认为美元. 实际上就是这样,这正是USDT开发团队的意思. Tether(USDT)是基于在Bitcoin Blockchain上发布的Omni Lay ...

  10. 查看linux系统版本及内核

    一.查看Linux系统版本的命令(3种方法) 1.适用于所有的Linux发行版 cat /etc/issue [root@S-CentOS home]# cat /etc/issue CentOS r ...