详解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 学习历程和心得分享
Dec 12 Javascript
3款实用的在线JS代码工具(国外)
Mar 15 Javascript
javascript 手动给表增加数据的小例子
Jul 10 Javascript
javascript实现des解密加密全过程
Apr 03 Javascript
jQuery中addClass()方法用法实例
Jan 05 Javascript
浅谈JavaScript中的作用域和闭包问题
Jul 07 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
Aug 05 Javascript
jQuery EasyUI常用数据验证汇总
Sep 18 Javascript
微信小程序wx:for循环的实例详解
Oct 07 Javascript
echarts实现词云自定义形状的示例代码
Feb 20 Javascript
Vue分页效果与购物车功能
Dec 13 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
set_include_path在win和linux下的区别
2008/01/10 PHP
php 各种应用乱码问题的解决方法
2010/05/09 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
PHP实现微信退款功能
2018/10/02 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
python检测远程服务器tcp端口的方法
2015/03/14 Python
python实现读取大文件并逐行写入另外一个文件
2018/04/19 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
pycharm显示远程图片的实现
2019/11/04 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
公证书标准格式
2014/04/10 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
研究生求职自荐书
2014/06/23 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
小学教育见习总结
2015/06/23 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
九年级英语教学反思
2016/02/15 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android