关于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 相关文章推荐
看了就知道什么是JSON
Dec 09 Javascript
DIV外区域Click后关闭DIV的实现代码
Dec 21 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
Apr 26 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
Mar 03 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
浅析javascript中的事件代理
Nov 06 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
layer弹窗插件操作方法详解
May 19 Javascript
浅谈express 中间件机制及实现原理
Aug 31 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
Sep 03 Javascript
JavaScript ES 模块的使用
Nov 12 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 程式大小
2006/12/06 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
JavaScript 序列化对象实现代码
2009/12/18 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
javascript实现完美拖拽效果
2015/05/06 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
python感知机实现代码
2019/01/18 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Django ModelForm操作及验证方式
2020/03/30 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
耐克美国官网:Nike.com
2016/08/01 全球购物
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
蔬菜基地的创业计划书
2014/01/06 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
欢迎词怎么写
2015/01/23 职场文书
如何在python中实现ECDSA你知道吗
2021/11/23 Python