关于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 相关文章推荐
Javascript连接多个数组不用concat来解决
Mar 24 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
Apr 02 Javascript
jQuery的基本概念与高级编程
May 14 Javascript
javascript的 {} 语句块详解
Feb 27 Javascript
vue组件生命周期详解
Nov 07 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
vue中v-show和v-if的异同及v-show用法
Jun 06 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
Vuex的实战使用详解
Oct 31 Javascript
vue调用本地摄像头实现拍照功能
Aug 14 Javascript
js+cavans实现图片滑块验证
Sep 29 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
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
Smarty模板配置实例简析
2019/07/20 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
js打开windows上的可执行文件示例
2014/05/27 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
Python命名空间详解
2014/08/18 Python
Python中字符串的修改及传参详解
2016/11/30 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
python的range和linspace使用详解
2019/11/27 Python
python super函数使用方法详解
2020/02/14 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
Html5新标签解释及用法
2012/02/17 HTML / CSS
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
AC Lens:购买隐形眼镜
2017/02/26 全球购物
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
槐乡的孩子教学反思
2014/04/27 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2014年工商所工作总结
2014/12/09 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书