JavaScript函数apply()和call()用法与异同分析


Posted in Javascript onAugust 10, 2018

本文实例分析了JavaScript函数apply()和call()用法与异同。分享给大家供大家参考,具体如下:

JavaScript的函数是对象,因此有属性和方法。每个函数都包含两个属性:lengthprototype,每个函数都包含两个非继承而来的方法:apply()call()

今天先来介绍一下前端面试中经常问到的apply()call()的区别吧!

这两个方法的作用是在函数调用时改变函数的执行上下文,也就是函数内的thisapply()方法接收两个参数,一个是在其中运行函数的作用域,另一个可以是arguments对象,也可以是参数数组。

call()方法与apply()方法的作用相同,它们的区别仅在于接收参数的方式不同,第一个参数不变,变化的是其余参数都直接传递给函数,也就是说,传递给函数的参数必须逐个列举出来。

JavaScript的参数在内部就是用一个数组来表示的,从这个意义上来说,apply比call的使用率更高,不必关心具体有多少个参数被传入函数,只要用apply一股脑传进去即可。若明确知道函数接收几个参数,且想一目了然地表达形参与实参的对应关系,可以使用call。

当使用call或apply时,若传入的第一个参数是null,函数体内的this会指向默认的宿主对象,在浏览器中是window,但在严格模式下,函数体内的this还是为null。有时,使用call或apply的目的不在于指定this指向,而是另有用途,如借用其他对象的方法,则此时可以传入null来替代某个具体的对象,如Math.max.apply(null, [1,5,2,4,3]]);

下面来举个例子:

function sum(num1, num2) {
  return num1 + num2;
}
function applyFunc1(num1, num2) {
  return sum.apply(this, arguments);
}
function applyFunc2(num1, num2) {
  return sum.apply(this, [num1, num2]);
}
function callFunc(num1, num2) {
  return sum.call(this, num1, num2);
}
alert(applyFunc1(10, 20));//输出:30
alert(applyFunc2(10, 20));//输出:30
alert(callFunc(10, 20));//输出:30

JS中的函数其实是对象,函数名是对Function对象的引用。

function add(a,b) {
  alert(a+b);
}
function sub(a,b) {
  alert(a-b);
}
add.call(sub,3,1); //输出:30

如果你认为apply()call()的作用在于传递参数,那就错了,它们真正强大的地方在于能够扩充函数赖以运行的作用域。

call和apply的用途:

(1)改变this的指向。

call和apply最常见的用途是改变函数内部的this指向。如上述例子所示。

(2)借用其他对象的方法。

1)借用方法的第一种场景是借用其他对象的构造函数。

var Student = function(name) {
  this.name = name;
};
var Teacher = function(name) {
  Student.apply(this,arguments);
};
Teacher.prototype.getName = function() {
  return this.name;
};
var teacher = new Teacher("Alice");
console.log(teacher.getName()); // 输出:Alice

2)借用方法的第二种场景是借用其他对象的方法。

当运行showColor.call(obj)时,函数的执行环境就进到了对象中。

window.color = "white";
var obj = {color: "black"};
function showColor() {
  alert(this.color);
}
showColor();//输出:"white"
showColor.call(this);//输出:"white"
showColor.call(window);//输出:"white"
showColor.call(obj);//输出:"black"

不需要把showColor()函数放到对象obj中,再通过obj来调用。

window.color = "white";
var obj = {color : "black"};
function showColor() {
  alert(this.color);
}
showColor();//输出:"white"
obj.showColor = showColor;
obj.showColor();//输出:"black"

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
$.getJSON在IE下失效的原因分析及解决方法
Jun 16 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
JavaScript弹出窗口方法汇总
Aug 12 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 Javascript
JS获取图片高度宽度的方法分享
Apr 17 Javascript
jQuery菜单插件用法实例
Jul 25 Javascript
jQuery获取Table某列的值(推荐)
Mar 03 Javascript
浅谈es6 javascript的map数据结构
Dec 14 Javascript
webuploader分片上传的实现代码(前后端分离)
Sep 10 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
Jun 05 Javascript
javascript中导出与导入实现模块化管理教程
Dec 03 Javascript
JavaScript闭包原理与用法实例分析
Aug 10 #Javascript
vue 动态绑定背景图片的方法
Aug 10 #Javascript
原生JS实现$.param() 函数的方法
Aug 10 #Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
Aug 10 #Javascript
JavaScript创建对象的常用方式总结
Aug 10 #Javascript
详解如何在nuxt中添加proxyTable代理
Aug 10 #Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
Aug 10 #Javascript
You might like
PHP脚本中include文件出错解决方法
2008/11/20 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
跟老齐学Python之开始真正编程
2014/09/12 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
Python shutil模块用法实例分析
2019/10/02 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
进程的查看和调度分别使用什么命令
2013/12/14 面试题
时尚女魔头观后感
2015/06/04 职场文书
您对思维方式了解多少?
2019/12/09 职场文书