详解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 相关文章推荐
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
js自动下载文件到本地的实现代码
Apr 28 Javascript
jquery toolbar与网页浮动工具条具体实现代码
Jan 12 Javascript
JS中处理时间之setUTCMinutes()方法的使用
Jun 12 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
探究Javascript模板引擎mustache.js使用方法
Jan 26 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
Nov 10 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
详解elementUI中input框无法输入的问题
Apr 27 Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 jQuery
Openlayers实现距离面积测量
Sep 28 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
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
Python tkinter模版代码实例
2020/02/05 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
Python运算符+与+=的方法实例
2021/02/18 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
文艺演出策划方案
2014/06/07 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
感谢信
2019/04/11 职场文书