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 DOM 学习第三章 内容表格
Feb 19 Javascript
基于jQuery的图片大小自动适应实现代码
Nov 17 Javascript
JS日期和时间选择控件升级版(自写)
Aug 02 Javascript
CSS javascript 结合实现悬浮固定菜单效果
Aug 23 Javascript
jQuery获取选中单选按钮radio的值
Dec 27 Javascript
基于hover的用法实例(推荐)
Jul 04 Javascript
javascript、php关键字搜索函数的使用方法
May 29 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
简单的React SSR服务器渲染实现
Dec 11 Javascript
vue多页面项目中路由使用history模式的方法
Sep 23 Javascript
Vue组件模板及组件互相引用代码实例
Mar 11 Javascript
如何用JavaScript检测当前浏览器是无头浏览器
Apr 27 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、Python和Javascript的装饰器模式对比
2015/02/03 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
JS中style属性
2006/10/11 Javascript
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
vue实现购物车小案例
2019/09/27 Javascript
Python Web服务器Tornado使用小结
2014/05/06 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Python抓取框架Scrapy爬虫入门:页面提取
2017/12/01 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
django的model操作汇整详解
2019/07/26 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
Django Form常用功能及代码示例
2020/10/13 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
美国糖果店:Sugarfina
2019/02/21 全球购物
工地资料员岗位职责
2013/12/31 职场文书
给朋友的道歉信
2014/01/09 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
普通党员个人整改措施
2014/10/27 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
Minikube搭建Kubernetes集群
2022/03/31 Servers