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 prototype 原型链
Mar 12 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
Jan 31 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
Feb 23 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
May 12 Javascript
微信小程序之ES6与事项助手的功能实现
Nov 30 Javascript
基于JavaScript实现图片剪切效果
Mar 07 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
Jun 12 jQuery
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
May 18 Javascript
详解在React-Native中持久化redux数据
May 22 Javascript
如何自定义微信小程序tabbar上边框的颜色
Jul 09 Javascript
详解elementui之el-image-viewer(图片查看器)
Aug 30 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
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
php数组去除空值函数分享
2015/02/02 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
js单例模式详解实例
2013/11/21 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
基python实现多线程网页爬虫
2015/09/06 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
python中set()函数简介及实例解析
2018/01/09 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
办公室文员工作职责
2014/01/31 职场文书
团日活动总结书
2014/05/08 职场文书
科技之星事迹材料
2014/06/02 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
通知书大全
2015/04/27 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript
Python中requests库的用法详解
2022/06/05 Python