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实现控制表格行高亮实例
Jun 05 Javascript
javascript自动给文本url地址增加链接的方法分享
Jan 20 Javascript
Jquery实现自定义tooltip示例代码
Feb 12 Javascript
JavaScript中的prototype.bind()方法介绍
Apr 04 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
json定义及jquery操作json的方法
Sep 29 Javascript
详解如何用模块化的方式写vuejs
Dec 16 Javascript
js判断节假日实例代码
Dec 27 Javascript
从零开始学习搭建React脚手架项目
Aug 23 Javascript
Vue结合后台导入导出Excel问题详解
Feb 19 Javascript
vuex + keep-alive实现tab标签页面缓存功能
Oct 17 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
将php数组输出html表格的方法
2014/02/24 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
js实现点击添加一个input节点
2014/12/05 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
Js apply方法详解
2017/02/16 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python常用正则表达式符号浅析
2014/08/13 Python
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
Python之循环结构
2019/01/15 Python
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
跟单文员岗位职责
2014/01/03 职场文书
我的求职计划书
2014/01/10 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
实验教师岗位职责
2014/02/13 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
高一军训的心得体会
2014/09/01 职场文书
毕业欢送会致辞
2015/07/29 职场文书
新郎新娘致辞
2015/07/31 职场文书
小学主题班会教案
2015/08/17 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server