详解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快速上手:写jQuery与直接写JS的区别详细解析
Aug 26 Javascript
javascript中的window.location.search方法简介
Sep 02 Javascript
js实现点击左右按钮轮播图片效果实例
Jan 29 Javascript
基于jQuery实现页面搜索功能
Mar 26 Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
EasyUI实现下拉框多选功能
Nov 07 Javascript
Vue+webpack项目基础配置教程
Feb 12 Javascript
使用puppeteer破解极验的滑动验证码
Feb 24 Javascript
select2 ajax 设置默认值,初始值的方法
Aug 09 Javascript
用js简单提供增删改查接口
May 12 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中for循环语句的几种变型
2006/11/26 PHP
source.php查看源文件
2006/12/09 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
编写Js代码要注意的几条规则
2010/09/10 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
JQuery球队选择实例
2015/05/18 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
python实现接口并发测试脚本
2019/06/25 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
护士岗位职责
2014/02/16 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
优秀教师单行材料
2014/12/16 职场文书
紧急迫降观后感
2015/06/15 职场文书
大学生入党自传2015
2015/06/26 职场文书
保护环境的宣传语
2015/07/13 职场文书
Python基础详解之描述符
2021/04/28 Python