JavaScript函数Call、Apply原理实例解析


Posted in Javascript onFebruary 17, 2020

这篇文章主要介绍了JavaScript函数Call、Apply原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、方法重用

使用 call() 方法,您可以编写能够在不同对象上使用的方法。

1、函数是对象方法

在 JavaScript 中,函数是对象的方法。

如果一个函数不是 JavaScript 对象的方法,那么它就是全局对象的函数(参见前一章)。

下面的例子创建了带有三个属性的对象(firstName、lastName、fullName)。

var person = {
  firstName:"Bill",
  lastName: "Gates",
  fullName: function () {
    return this.firstName + " " + this.lastName;
  }
}
person.fullName();    // 将返回 "Bill Gates"

fullName 属性是一个方法。person 对象是该方法的拥有者。

fullName 属性属于 person 对象的方法。

二、call() 方法

call() 方法是预定义的 JavaScript 方法。

它可以用来调用所有者对象作为参数的方法。

通过 call(),您能够使用属于另一个对象的方法。

本例调用 person 的 fullName 方法,并用于 person1:

var person = {
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
}
var person1 = {
  firstName:"Bill",
  lastName: "Gates",
}
var person2 = {
  firstName:"Steve",
  lastName: "Jobs",
}
person.fullName.call(person1); // 将返回 "Bill Gates"

本例调用 person 的 fullName 方法,并用于 person2:

var person = {
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
}
var person1 = {
  firstName:"John",
  lastName: "Doe",
}
var person2 = {
  firstName:"Mary",
  lastName: "Doe",
}
person.fullName.call(person2); // 将返回 "Steve Jobs"

1、带参数的 call() 方法

call() 方法可接受参数:

var person = {
 fullName: function(city, country) {
  return this.firstName + " " + this.lastName + "," + city + "," + country;
 }
}
var person1 = {
 firstName:"Bill",
 lastName: "Gates"
}
person.fullName.call(person1, "Seattle", "USA");

三、 apply() 方法

apply() 方法与 call() 方法非常相似:

在本例中,person 的 fullName 方法被应用到 person1:

var person = {
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
}
var person1 = {
  firstName: "Bill",
  lastName: "Gates",
}
person.fullName.apply(person1); // 将返回 "Bill Gates"

1、call() 和 apply() 之间的区别

不同之处是:

call() 方法分别接受参数。

apply() 方法接受数组形式的参数。

如果要使用数组而不是参数列表,则 apply() 方法非常方便。

2、带参数的 apply() 方法

apply() 方法接受数组中的参数:

var person = {
 fullName: function(city, country) {
  return this.firstName + " " + this.lastName + "," + city + "," + country;
 }
}
var person1 = {
 firstName:"John",
 lastName: "Doe"
}
person.fullName.apply(person1, ["Oslo", "Norway"]);

与 call() 方法对比:

var person = {
 fullName: function(city, country) {
  return this.firstName + " " + this.lastName + "," + city + "," + country;
 }
}
var person1 = {
 firstName:"John",
 lastName: "Doe"
}
person.fullName.call(person1, "Oslo", "Norway");

3、在数组上模拟 max 方法

您可以使用 Math.max() 方法找到(数字列表中的)最大数字:

Math.max(1,2,3); // 会返回 3

由于 JavaScript 数组没有 max() 方法,因此您可以应用 Math.max() 方法。

Math.max.apply(null, [1,2,3]); // 也会返回 3

第一个参数(null)无关紧要。在本例中未使用它。

这些例子会给出相同的结果:

Math.max.apply(Math, [1,2,3]); // 也会返回 3
Math.max.apply(" ", [1,2,3]); // 也会返回 3
Math.max.apply(0, [1,2,3]); // 也会返回 3

4、JavaScript 严格模式

在 JavaScript 严格模式下,如果 apply() 方法的第一个参数不是对象,则它将成为被调用函数的所有者(对象)。在“非严格”模式下,它成为全局对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
JSON相关知识汇总
Jul 03 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
Aug 24 Javascript
Javascript实现单例模式
Jan 24 Javascript
浅析jquery与checkbox的checked属性的问题
Apr 27 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
Aug 05 Javascript
微信小程序  wx.request合法域名配置详解
Nov 23 Javascript
JavaScript实现三级联动菜单实例代码
Jun 26 Javascript
在vue中获取token,并将token写进header的方法
Sep 26 Javascript
layui扩展上传组件模拟进度条的方法
Sep 23 Javascript
vue 子组件修改data或调用操作
Aug 07 Javascript
详解JavaScript原型与原型链
Nov 16 Javascript
javascript异常处理实现原理详解
Feb 17 #Javascript
Vue+webpack实现懒加载过程解析
Feb 17 #Javascript
javascript History对象原理解析
Feb 17 #Javascript
Vue中fragment.js使用方法小结
Feb 17 #Javascript
javascript实现倒计时效果
Feb 17 #Javascript
JavaScript将数组转换为链表的方法
Feb 16 #Javascript
javascript canvas API内容整理
Feb 16 #Javascript
You might like
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
JS简单实现数组去重的方法分析
2017/10/14 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
使用Python写CUDA程序的方法
2017/03/27 Python
python实现简易版计算器
2020/06/22 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python WSGI的深入理解
2018/08/01 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
销售员岗位职责范本
2015/04/11 职场文书
护士2015年终工作总结
2015/04/29 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
APP界面设计技巧和注意事项
2022/04/29 杂记