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之bind使用介绍
Oct 09 Javascript
jquery做的一个简单的屏幕锁定提示框
Mar 26 Javascript
Angular中的Promise对象($q介绍)
Mar 03 Javascript
JS简单实现点击复制链接的方法
Aug 03 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
AngularJs 常用的过滤器
May 15 Javascript
js弹性势能动画之抛物线运动实例详解
Jul 27 Javascript
使用Node.js实现RESTful API的示例
Aug 01 Javascript
es6数值的扩展方法
Mar 11 Javascript
create-react-app中添加less支持的实现
Nov 15 Javascript
Node 模块原理与用法详解
May 13 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 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上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
mysql总结之explain
2012/02/27 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
javascript中Object使用详解
2015/01/26 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
python处理html转义字符的方法详解
2016/07/01 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
解读! Python在人工智能中的作用
2017/11/14 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
Python实现读取json文件到excel表
2017/11/18 Python
python 实现登录网页的操作方法
2018/05/11 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
大学军训通讯稿
2014/01/13 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
销售求职信范文
2014/05/26 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
会计师事务所实习证明
2014/11/16 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技