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淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
js加减乘除丢失精度问题解决方法
May 16 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
Mar 26 Javascript
JS实现图片的不间断连续滚动的简单实例
Jun 03 Javascript
vue.js从安装到搭建过程详解
Mar 17 Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 Javascript
vue自定义指令directive实例详解
Jan 17 Javascript
vue2.0.js的多级联动选择器实现方法
Feb 09 Javascript
vue返回上一页面时回到原先滚动的位置的方法
Dec 20 Javascript
简单了解JavaScript中的执行上下文和堆栈
Jun 24 Javascript
原生js实现日期选择插件
May 21 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获得文件扩展名三法
2006/11/25 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
原生js调用json方法总结
2018/02/22 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
python开发中module模块用法实例分析
2015/11/12 Python
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
Python格式化日期时间操作示例
2018/06/28 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
医学护理毕业生自荐信
2013/11/07 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
青春无悔演讲稿
2014/05/08 职场文书
环保标语大全
2014/06/12 职场文书
推广普通话标语
2014/06/27 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
canvas实现贪食蛇的实践
2022/02/15 Javascript
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫