关于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 相关文章推荐
jquery下实现overlay遮罩层代码
Aug 25 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
Jan 13 Javascript
jQuery中获取checkbox选中项等操作及注意事项
Nov 24 Javascript
实现js保留小数点后N位的代码
Nov 13 Javascript
jQuery实现简单的间隔向上滚动效果
Mar 09 Javascript
Jquery中基本选择器用法实例详解
May 18 Javascript
微信小程序 wxapp画布 canvas详细介绍
Oct 31 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
Aug 17 Javascript
如何编写一个d.ts文件的步骤详解
Apr 13 Javascript
微信小程序实现按字母排列选择城市功能
Nov 25 Javascript
javascript实现点击星星小游戏
Dec 24 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
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
解密效果
2006/06/23 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
用Python编写一个国际象棋AI程序
2014/11/28 Python
基于python的字节编译详解
2017/09/20 Python
Python中文件的读取和写入操作
2018/04/27 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
园林施工员岗位职责
2013/12/11 职场文书
财产公证书样本
2014/04/04 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
毕业生个人自荐书
2015/03/05 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
《1942》观后感
2015/06/08 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
python实现自动化群控的步骤
2021/04/11 Python