详解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 实现对象 匀速/变速运动的方法
May 08 Javascript
javascript获取下拉列表框当中的文本值示例代码
Jul 31 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
Jan 16 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
Javascript 5种方法实现过滤删除前后所有空格
Jun 22 Javascript
Bootstrap导航条学习使用(二)
Feb 08 Javascript
Vue.2.0.5过渡效果使用技巧
Mar 16 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
Jun 12 Javascript
angularjs实现分页和搜索功能
Jan 03 Javascript
js生成word中图片处理方法
Jan 06 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
Oct 14 Javascript
Vue实现Header渐隐渐现效果的实例代码
Nov 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
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
浅谈struts1 & jquery form 文件异步上传
2017/05/25 jQuery
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
python处理csv数据的方法
2015/03/11 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
pandas通过索引进行排序的示例
2018/11/16 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
python实现密码强度校验
2020/03/18 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
实习医生自我评价
2013/09/22 职场文书
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB