JS call()及apply()方法使用实例汇总


Posted in Javascript onJuly 11, 2020

最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧。

每个函数都包含两个非继承而来的方法:call()方法和apply()方法。

相同点:这两个方法的作用是一样的。

都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。

一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。

call()方法使用示例:

//例1
  <script>
    window.color = 'red';
    document.color = 'yellow';

    var s1 = {color: 'blue' };
    function changeColor(){
      console.log(this.color);
    }

    changeColor.call();     //red (默认传递参数)
    changeColor.call(window);  //red
    changeColor.call(document); //yellow
    changeColor.call(this);   //red
    changeColor.call(s1);    //blue

  </script>

  //例2
  var Pet = {
    words : '...',
    speak : function (say) {
      console.log(say + ''+ this.words)
    }
  }
  Pet.speak('Speak'); // 结果:Speak...

  var Dog = {
    words:'Wang'
  }

  //将this的指向改变成了Dog
  Pet.speak.call(Dog, 'Speak'); //结果: SpeakWang

apply()方法使用示例:

//例1
  <script>
    window.number = 'one';
    document.number = 'two';

    var s1 = {number: 'three' };
    function changeColor(){
      console.log(this.number);
    }

    changeColor.apply();     //one (默认传参)
    changeColor.apply(window);  //one
    changeColor.apply(document); //two
    changeColor.apply(this);   //one
    changeColor.apply(s1);    //three

  </script>

  //例2
  function Pet(words){
    this.words = words;
    this.speak = function () {
      console.log( this.words)
    }
  }
  function Dog(words){
    //Pet.call(this, words); //结果: Wang
    Pet.apply(this, arguments); //结果: Wang
  }
  var dog = new Dog('Wang');
  dog.speak();

不同点:接收参数的方式不同。

apply()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
语法:apply([thisObj [,argArray] ]);,调用一个对象的一个方法,2另一个对象替换当前对象。

说明:如果argArray不是一个有效数组或不是arguments对象,那么将导致一个
TypeError,如果没有提供argArray和thisObj任何一个参数,那么Global对象将用作thisObj。

call()方法 第一个参数和apply()方法的一样,但是传递给函数的参数必须列举出来。
语法:call([thisObject[,arg1 [,arg2 [,...,argn]]]]);,应用某一对象的一个方法,用另一个对象替换当前对象。

说明: call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。

使用示例1:

function add(c,d){
    return this.a + this.b + c + d;
  }

  var s = {a:1, b:2};
  console.log(add.call(s,3,4)); // 1+2+3+4 = 10
  console.log(add.apply(s,[5,6])); // 1+2+5+6 = 14

使用示例2:

<script>
    window.firstName = "Cynthia"; 
    window.lastName = "_xie";

    var myObject = {firstName:'my', lastName:'Object'};

    function getName(){
      console.log(this.firstName + this.lastName);
    }

    function getMessage(sex,age){
      console.log(this.firstName + this.lastName + " 性别: " + sex + " age: " + age );
    }

    getName.call(window); // Cynthia_xie
    getName.call(myObject); // myObject

    getName.apply(window); // Cynthia_xie
    getName.apply(myObject);// myObject

    getMessage.call(window,"女",21); //Cynthia_xie 性别: 女 age: 21
    getMessage.apply(window,["女",21]); // Cynthia_xie 性别: 女 age: 21

    getMessage.call(myObject,"未知",22); //myObject 性别: 未知 age: 22
    getMessage.apply(myObject,["未知",22]); // myObject 性别: 未知 age: 22

  </script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript下过滤数组重复值的代码
Sep 10 Javascript
js异或加解密效果代码
Jun 25 Javascript
浅谈javascript 归并方法
Jan 21 Javascript
js与jquery回车提交的方法
Feb 03 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 Javascript
详解JavaScript RegExp对象
Feb 04 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
Jul 25 Javascript
在Vue中获取组件声明时的name属性方法
Sep 12 Javascript
微信小程序实现时间预约功能
Nov 27 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
Oct 14 Javascript
JS实现音乐钢琴特效
Jan 06 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
JS如何定义用字符串拼接的变量
Jul 11 #Javascript
基于原生js实现判断元素是否有指定class名
Jul 11 #Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
Jul 11 #Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
Jul 11 #Javascript
uniapp,微信小程序中使用 MQTT的问题
Jul 11 #Javascript
VSCode 配置uni-app的方法
Jul 11 #Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 #Javascript
You might like
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
JS动态日期时间的获取方法
2015/09/28 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python上下文管理器和with块详解
2017/09/09 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
高等教育专业自荐信范文
2014/03/26 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
四风问题查摆材料
2014/08/25 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
护士工作失误检讨书
2014/09/14 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书