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 live( type, fn ) 委派事件实现
Oct 11 Javascript
基于jQuery的投票系统显示结果插件
Aug 12 Javascript
JavaScript中合并数组的N种方法
Sep 16 Javascript
详解Document.Cookie
Dec 25 Javascript
JS递归遍历对象获得Value值方法技巧
Jun 14 Javascript
fullpage.js全屏滚动插件使用实例
Sep 06 Javascript
js仿百度音乐全选操作
Jan 13 Javascript
Vue精简版风格概述
Jan 30 Javascript
微信小程序列表中item左滑删除功能
Nov 07 Javascript
微信小程序错误this.setData报错及解决过程
Sep 18 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 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第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
php如何连接sql server
2015/10/16 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
js鼠标跟随运动效果
2017/03/11 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
python中__call__内置函数用法实例
2015/06/04 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
关于期中考试的反思
2014/02/02 职场文书
总经理助理职责
2014/02/04 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
公司股东出资证明书
2014/11/01 职场文书
大学生入党自荐书
2015/03/05 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python