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 相关文章推荐
jquery下实现overlay遮罩层代码
Aug 25 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
Aug 31 Javascript
Javascript动画效果(2)
Oct 11 Javascript
jQuery点击头像上传并预览图片
Feb 23 Javascript
iframe与主框架跨域相互访问实现方法
Sep 14 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
Nov 27 Javascript
vue小白入门教程
Apr 02 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
angular将html代码输出为内容的实例
Sep 30 Javascript
JS错误处理与调试操作实例分析
Apr 13 Javascript
vuex实现购物车的增加减少移除
Jun 28 Javascript
如何使用gpu.js改善JavaScript的性能
Dec 01 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/12/08 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
php时间戳转换代码详解
2019/08/04 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
Angular2库初探
2017/03/01 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
Vue header组件开发详解
2018/01/26 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
Python反转序列的方法实例分析
2018/03/21 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
室内设计自我鉴定
2013/10/15 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
golang 实现两个结构体复制字段
2021/04/28 Golang
MySql新手入门的基本操作汇总
2021/05/13 MySQL
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers
基于docker安装zabbix的详细教程
2022/06/05 Servers
Linux安装Docker详细教程
2022/07/07 Servers