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 document.images实例
May 27 Javascript
js动画效果制件让图片组成动画代码分享
Jan 14 Javascript
简单介绍JavaScript数据类型之隐式类型转换
Dec 28 Javascript
基于Bootstrap+jQuery.validate实现表单验证
May 30 Javascript
星期几的不同脚本写法(推荐)
Jun 01 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
Oct 10 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
图片加载完成再执行事件的实例
Nov 16 Javascript
js构造函数创建对象是否加new问题
Jan 22 Javascript
微信小程序实现长按删除图片的示例
May 18 Javascript
原生js实现html手机端城市列表索引选择城市
Jun 24 Javascript
three.js 制作动态二维码的示例代码
Jul 31 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.ini中文版(2)
2006/10/09 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
详解json在php中的应用
2018/09/30 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
js function使用心得
2010/05/10 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
py2exe 编译ico图标的代码
2013/03/08 Python
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python KMeans聚类问题分析
2018/02/23 Python
Numpy掩码式数组详解
2018/04/17 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
小学节能减排倡议书
2014/05/15 职场文书
改革共识倡议书
2014/08/29 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2014年个人年终总结
2015/03/09 职场文书
会计岗位职责范本
2015/04/02 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python