详解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 相关文章推荐
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
jQuery实现瀑布流布局
Dec 12 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
基于jquery实现全屏滚动效果
Nov 26 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
Apr 08 Javascript
JS获取checkbox的个数简单实例
Aug 19 Javascript
JavaScript中双符号的运算详解
Mar 12 Javascript
php 修改密码实现代码
May 24 Javascript
微信小程序自定义弹窗wcPop插件
Nov 19 Javascript
移动端如何用下拉刷新的方式实现上拉加载
Dec 10 Javascript
世界上最短的数字判断js代码
Sep 09 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
Sep 07 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
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
AngularJS入门之动画
2016/07/27 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
python实现文件快照加密保护的方法
2015/06/30 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
Python多线程正确用法实例解析
2020/05/30 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
文明寝室标语
2014/06/13 职场文书
干部对照检查材料范文
2014/08/26 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers