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 相关文章推荐
js下弹出窗口的变通
Apr 18 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
IE之动态添加DOM节点触发window.resize事件
Jul 27 Javascript
js中unicode转码方法详解
Oct 09 Javascript
JavaScript数组的一些奇葩行为
Jan 25 Javascript
javascript正则表达式总结
Feb 29 Javascript
JavaScript自学笔记(必看篇)
Jun 23 Javascript
JS继承之借用构造函数继承和组合继承
Sep 07 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
Dec 20 Javascript
jQuery无缝轮播图代码
Dec 22 Javascript
Angular项目如何升级至Angular6步骤全纪录
Sep 03 Javascript
这应该是最详细的响应式系统讲解了
Jul 22 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
php页面消耗内存过大的处理办法
2013/03/18 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
微信小程序入门教程
2016/11/18 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
python正则表达式re之compile函数解析
2017/10/25 Python
pybind11在Windows下的使用教程
2019/07/04 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
python列表的逆序遍历实现
2020/04/20 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
Python如何实现单例模式
2016/06/03 面试题
单位消防安全制度
2014/01/12 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
学生病假条范文
2015/08/17 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL