详解js中call与apply关键字的作用


Posted in Javascript onNovember 21, 2016

javascript call与apply关键字的作用

apply接受两个参数。第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合。

call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数。

var func = function(a,b,c)
{
 alert(a + b + c);
}
func.apply(null,[1,2,3]);//弹出6
func.call(null,1,2,3);//弹出6

当apply与call传入的第一个参数为null时,函数体内的this会指向window。

当apply与call传入的第一个参数为null时,函数体内的this会指向window。

call与apply的用途

1、改变this的指向

var obj1 = {
 name = '刘备'
}
 
var obj2 = {
 name = '曹操'
}
var getName = function(){
 alert(this.name);
}
 
window.name = '三国';
getName();//弹出"三国"
getName.call(obj1);//弹出"刘备"
getName.call(obj2);//弹出"曹操"

所以,当在一些情况下this被莫名改变指向之后,可以使用call或apply来进行修正this的指向。

document.getElementById('div1').onclick = function(){
 alert(this.id);//div1
 var fun1 = function(){
  alert(this.id);//window.id 即undefined
 }
 fun1();//普通函数的方式调用,this指代window,相当于window.id 即 undefined
}

由于是普通函数的方式调用,所以上面的例子中,this已经变成了window。下面看看如何使用call进行修正。

document.getElementById('div1').onclick = function(){
 alert(this.id);
 var fun1 = function(){
  alert(this.id);
 }
 fun1.call(this);//强制函数内的this为外层的this,
}

2、调用其他对象的函数

示例1:

var obj1 = {
 a:1,
 b:2,
 add:function()
 {
  return this.a + this.b;
 }
}
var obj2 = {
 a:1,
 b:2,
}
var result = obj1.add.call(obj2);//用obj1的函数来计算obj2的两个属性的和
alert(result);//输出3

示例2:借用构造函数实现类似继承的效果

var A = function(name)
{
 this.name = name;
};
var B = function(){
 A.apply(this,arguments)
}
B.prototype.getName = function(){
 return this.name;
}
var b = new B('刘备');
alert(b.getName());

以上就是本文的内容,有问题可以和小编联系,谢谢对三水点靠木的支持!

Javascript 相关文章推荐
使用javascript过滤html的字符串(注释标记法)
Jul 08 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
js实现iframe自动自适应高度的方法
Feb 17 Javascript
谈谈我对JavaScript DOM事件的理解
Dec 18 Javascript
微信小程序 教程之注册程序
Oct 17 Javascript
jquery+Jscex打造游戏力度条
Sep 12 Javascript
JavaScript组件开发之输入框加候选框
Mar 10 Javascript
react.js使用webpack搭配环境的入门教程
Aug 14 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
JavaScript常用事件介绍
Jan 21 Javascript
VueX模块的具体使用(小白教程)
Jun 05 Javascript
vue实现数字滚动效果
Jun 29 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
Nov 21 #Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
Nov 21 #Javascript
全面解析node 表单的图片上传
Nov 21 #Javascript
利用fecha进行JS日期处理
Nov 21 #Javascript
Bootstrap Modal遮罩弹出层(完整版)
Nov 21 #Javascript
Bootstrap Modal遮罩弹出层代码分享
Nov 21 #Javascript
jQuery事件绑定方法学习总结(推荐)
Nov 21 #Javascript
You might like
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
php接口技术实例详解
2016/12/07 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
很酷的javascript loading效果代码
2008/06/18 Javascript
很可爱的输入框
2008/08/03 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
python妙用之编码的转换详解
2017/04/21 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
python tkinter组件摆放方式详解
2019/09/16 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
python求绝对值的三种方法小结
2019/12/04 Python
详解python如何引用包package
2020/06/07 Python
技术总监岗位职责
2013/12/05 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
美容院店长岗位职责
2014/04/08 职场文书
节水口号标语
2014/06/19 职场文书
单位工作证明格式模板
2014/10/04 职场文书
加入学生会自荐书
2015/03/05 职场文书
英语演讲开场白
2015/05/29 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android