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语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
基于jQuery的弹出框插件
Mar 18 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
Apr 11 Javascript
模拟电子签章盖章效果的jQuery插件源码
Jun 24 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
Sep 06 Javascript
vue router仿天猫底部导航栏功能
Oct 18 Javascript
详解小程序云开发数据库
May 20 Javascript
微信小程序如何实现全局重新加载
Jun 05 Javascript
学习LayUI时自研的表单参数校验框架案例分析
Jul 29 Javascript
浅入深出Vue之自动化路由
Aug 06 Javascript
layui写后台表格思路和赋值用法详解
Nov 14 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
菜鸟修复电子管记
2021/03/02 无线电
php+oracle 分页类
2006/10/09 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
javascript通过class来获取元素实现代码
2013/02/20 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
微信小程序 自定义消息提示框
2017/08/06 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
python修改注册表终止360进程实例
2014/10/13 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
毕业生找工作的自我评价
2013/10/18 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书