详解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 图片上传按比例预览插件集合
May 28 Javascript
JavaScript中的异常捕捉介绍
Dec 31 Javascript
基于JS模仿windows文件按名称排序效果
Jun 29 Javascript
使用JSON作为函数的参数的优缺点
Oct 27 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
Nov 10 Javascript
JavaScript实现解析INI文件内容的方法
Nov 17 Javascript
详解jQuery uploadify文件上传插件的使用方法
Dec 16 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
Feb 24 Javascript
JavaScript函数中的this四种绑定形式
Aug 15 Javascript
加速vue组件渲染之性能优化
Apr 09 Javascript
Javascript如何递归遍历本地文件夹
Aug 06 Javascript
手把手教你从零开始react+antd搭建项目
Jun 03 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
建立文件交换功能的脚本(三)
2006/10/09 PHP
WHOIS类的修改版
2006/10/09 PHP
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
Python中的Numpy矩阵操作
2018/08/12 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
大学生四年生活自我鉴定
2013/11/21 职场文书
完美主义个人的自我评价
2014/02/17 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
护士求职自荐信范文
2014/03/19 职场文书
节能宣传周活动总结
2014/05/08 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
上党课的心得体会
2014/09/02 职场文书
商业用房租赁协议书
2014/10/13 职场文书
认真学习保证书
2015/02/26 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python