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 相关文章推荐
DOM 脚本编程中的兄弟节点
Oct 31 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
Aug 21 Javascript
二叉树先序遍历的非递归算法具体实现
Jan 09 Javascript
js使用eval解析json实例与注意事项分享
Jan 18 Javascript
Bootstrap每天必学之基础排版
Nov 20 Javascript
html+js实现简单的计算器代码(加减乘除)
Jul 12 Javascript
微信小程序 navbar实例详解
May 11 Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 Javascript
vue2.0 computed 计算list循环后累加值的实例
Mar 07 Javascript
vue实现与安卓、IOS交互的方法
Nov 02 Javascript
layui 表格操作列按钮动态显示的实现方法
Sep 06 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
May 10 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
Extjs中常用表单介绍与应用
2010/06/07 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
Python学习小技巧之列表项的排序
2017/05/20 Python
Python文件操作基本流程代码实例
2017/12/11 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
财务会计人员求职的自我评价
2014/01/13 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
旷工检讨书1000字
2015/01/01 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
2016年清明节寄语
2015/12/04 职场文书