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权威指南 学习笔记之null和undefined
Sep 25 Javascript
javascript中的window.location.search方法简介
Sep 02 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
Nov 18 Javascript
jquery实现省市select下拉框的替换(示例代码)
Feb 22 Javascript
JavaScript AJAX之惰性载入函数
Aug 27 Javascript
VUEJS实战之构建基础并渲染出列表(1)
Jun 13 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
Three.js入门之hello world以及如何绘制线
Sep 25 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
Nov 26 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
Jun 04 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 jQuery
详解为element-ui的Select和Cascader添加弹层底部操作按钮
Feb 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写的serv-u的web申请账号的程序
2006/10/09 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
用js得到网页中所有的div的id
2020/10/19 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
微信小程序-详解数据缓存
2016/11/24 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
js实现点击生成随机div
2020/01/16 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
Python中and和or如何使用
2020/05/28 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
.net面试题
2016/09/17 面试题
测试驱动开发的主要步骤是什么
2014/12/10 面试题
出国留学介绍信
2014/01/13 职场文书
数字化校园建设方案
2014/05/03 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
delete in子查询不走索引问题分析
2022/07/07 MySQL