详解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面向对象入门基础详细介绍
Sep 05 Javascript
js 获取元素在页面上的偏移量的方法汇总
Apr 13 Javascript
JavaScript实现图片轮播的方法
Jul 31 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
Bootstrap实现input控件失去焦点时验证
Aug 04 Javascript
JavaScript 继承详解(五)
Oct 11 Javascript
纯js实现动态时间显示
Sep 07 Javascript
webpack打包非模块化js的方法
Oct 24 Javascript
Webstorm2016使用技巧(SVN插件使用)
Oct 29 Javascript
javascript 高级语法之继承的基本使用方法示例
Nov 11 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 Javascript
原生js中运算符及流程控制示例详解
Jan 05 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
php实现图片缩放功能类
2013/12/18 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
基于php编程规范(详解)
2017/08/17 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
vue中appear的用法
2017/08/17 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
python 正则式使用心得
2009/05/07 Python
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
深入理解Python对Json的解析
2017/02/14 Python
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
网上卖盒饭创业计划书
2014/01/26 职场文书
优秀毕业生就业推荐信
2014/05/22 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
Python破解极验滑动验证码详细步骤
2021/05/21 Python
Nginx缓存设置案例详解
2021/09/15 Servers