详解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 相关文章推荐
jQuery asp.net 用json格式返回自定义对象
Apr 07 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
Mar 25 Javascript
jquery果冻抖动效果实现方法
Jan 15 Javascript
js面向对象之公有、私有、静态属性和方法详解
Apr 17 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
element-ui 本地化使用教程详解
Oct 28 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 Javascript
Vue中多元素过渡特效的解决方案
Feb 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
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
Jquery replace 字符替换实现代码
2010/12/02 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
js跳转页面方法总结
2014/01/29 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
Python subprocess模块学习总结
2014/03/13 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
python 格式化输出百分号的方法
2019/01/20 Python
python绘制多个子图的实例
2019/07/07 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
一套带网友答案的.NET笔试题
2016/12/06 面试题
如何写一个自定义标签
2012/12/28 面试题
拉丁舞学习者的自我评价
2013/10/27 职场文书
房展策划方案
2014/06/07 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL