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函数使用技巧之 setTimeout(function(){},0)
Feb 09 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
javascript操作数组详解
Dec 17 Javascript
JavaScript生成随机字符串的方法
Mar 19 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
JavaScript常用基础知识强化学习
Dec 09 Javascript
基于javascript制作经典传统的拼图游戏
Mar 22 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
Nov 22 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
vue webpack打包后图片路径错误的完美解决方法
Dec 07 Javascript
js滚轮事件 js自定义滚动条的实现
Jan 18 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/06/29 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
原生js实现购物车功能
2020/09/23 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
wxPython中文教程入门实例
2014/06/09 Python
Python对象转JSON字符串的方法
2016/04/27 Python
对python:print打印时加u的含义详解
2018/12/15 Python
Python魔法方法功能与用法简介
2019/04/04 Python
详解Python用户登录接口的方法
2019/04/17 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
python 进程池pool使用详解
2020/10/15 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
教育学专业实习生的自我鉴定
2013/11/26 职场文书
实习生自荐信范文分享
2013/11/27 职场文书
服装设计专业自荐书范文
2013/12/30 职场文书
大学生创业计划书的范文
2014/01/07 职场文书
业务总经理岗位职责
2014/02/03 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
欢迎标语大全
2014/06/21 职场文书
元旦晚会活动总结
2014/07/09 职场文书
教师先进个人材料
2014/12/17 职场文书
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏