关于JS中的apply,call,bind的深入解析


Posted in Javascript onApril 05, 2016

在Javascript中,Function是一种对象。Function对象中的this指向决定于函数被调用的方式。使用apply,call 与 bind 均可以改变函数对象中this的指向,在说区别之前还是先总结一下三者的相似之处:
1、都是用来改变函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都可以利用后续参数传参。

call方法:

语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply:

语法:apply(thisObj,数组参数)
定义:应用某一个对象的一个方法,用另一个对象替换当前对象
说明:如果参数不是数组类型的,则会报一个TypeError错误。

bind:

在EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持),bind与call很相似,,例如,可接受的参数都分为两部分,且第一个参数都是作为执行时函数上下文中的this的对象。不同点有两个:
①bind的返回值是函数;②后面的参数的使用也有区别;

先看例子一:

 

function add(a, b) {
  alert(a + b);
}
function sub(a, b) {
  alert(a - b);
}

对于,call,可以这么用:
add.call(sub,3,1);结果为4

对于,apply,可以这么用;
add.apply(sub,[3,1]);结果为4

对于,bind,可以这么用:
add.bind(sub)(3,1);结果为4

可以看到输出结果都一样,但是传参用法不一样;

再看例子二:

function jone(name,age,work){
  this.name=name;
  this.age=age;
  this.work=work;
  this.say=function(msg){
    alert(msg+",我叫"+this.name+",我今年"+this.age+"岁,我是"+this.work)
  }
}
var jack={
  name:"jack",
  age:'24',
  work:"学生"
}
var pet=new jone();

pet.say.apply(jack,["欢迎您"])
console.log(this.name)

对于call,需要这样:
pet.say.call(jack,"欢迎您!")

对于apply,需要这样:
pet.say.apply(jack,["欢迎您!"])

对于bind,需要这样:
pet.say.bind(jack,"欢迎您")()

此时输出console.log(this.name),发现this.name为jack,this上下文已经发生改变了;

以上这篇关于JS中的apply,call,bind的深入解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Document对象内容集合(比较全)
Sep 06 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
Oct 20 Javascript
Jquery实现控件的隐藏和显示实例
Feb 08 Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
js实现鼠标点击左上角滑动菜单效果代码
Sep 06 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
JavaScript电子时钟倒计时
Jan 09 Javascript
详解JavaScript对象类型
Jun 16 Javascript
简单实现js倒计时功能
Feb 13 Javascript
原生JS实现获取及修改CSS样式的方法
Sep 04 Javascript
vue增加强缓存和版本号的实现方法
May 01 Javascript
vue实现把接口单独存放在一个文件方式
Aug 13 Javascript
javascript中apply、call和bind的使用区别
Apr 05 #Javascript
JavaScript数组去重的两种方法推荐
Apr 05 #Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 #Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 #Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 #Javascript
javascript HTML5 canvas实现打砖块游戏
Jun 18 #Javascript
jQuery EasyUI中DataGird动态生成列的方法
Apr 05 #Javascript
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
python去掉行尾的换行符方法
2017/01/04 Python
Python简单的制作图片验证码实例
2017/05/31 Python
python编程羊车门问题代码示例
2017/10/25 Python
Python探索之ModelForm代码详解
2017/10/26 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
正规的求职信范文分享
2013/12/11 职场文书
集体婚礼策划方案
2014/02/22 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
元宵晚会主持词
2014/03/25 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
小学记事作文之200字
2019/08/06 职场文书
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python