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常见用法总结
May 22 Javascript
单元选择合并变色示例代码
May 26 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
Aug 11 Javascript
js实现图片轮播效果
Dec 19 Javascript
使用递归遍历对象获得value值的实现方法
Jun 14 Javascript
微信浏览器禁止页面下拉查看网址实例详解
Jun 28 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
Apr 13 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
Jun 05 Javascript
Vue $emit $refs子父组件间方法的调用实例
Sep 12 Javascript
Vue+Django项目部署详解
May 30 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
Oct 23 Javascript
vue实现pdf文档在线预览功能
Nov 26 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文件怎么打开 如何执行php文件
2011/12/21 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php 问卷调查结果统计
2015/10/08 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
JS实现简单的键盘打字的效果
2015/04/24 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
python 实现插入排序算法
2012/06/05 Python
Python深入学习之内存管理
2014/08/31 Python
python中assert用法实例分析
2015/04/30 Python
5种Python单例模式的实现方式
2016/01/14 Python
Python 序列的方法总结
2016/10/18 Python
python3 实现口罩抽签的功能
2020/03/11 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
高分子材料与工程专业个人求职信
2013/12/15 职场文书
监察建议书范文
2014/03/12 职场文书
投标诚信承诺书
2014/05/26 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
Python的三个重要函数详解
2022/01/18 Python