详解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 相关文章推荐
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
Dec 28 Javascript
基于Jquery的仿照flash放大图片效果代码
Mar 16 Javascript
javascript ajax的5种状态介绍
Aug 18 Javascript
JavaScript动态创建form表单并提交的实现方法
Dec 10 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
Mar 14 Javascript
javascript 数组的正态分布排序的问题
Jul 31 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
Dec 26 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
Aug 18 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
Angular2之二级路由详解
Aug 31 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 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实现过滤UBB代码的类
2015/03/12 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
js选择器全面解析
2016/06/27 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
python实现输入数字的连续加减方法
2018/06/22 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
《莫高窟》教学反思
2014/02/25 职场文书
初三新学期计划书
2014/05/03 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
商铺租房协议书范本
2014/12/04 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记