关于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 相关文章推荐
关于js注册事件的常用方法
Apr 03 Javascript
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
jQuery固定浮动侧边栏实现思路及代码
Sep 28 Javascript
js选项卡的实现方法
Feb 09 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
Aug 13 Javascript
JavaScript中匿名函数的用法及优缺点详解
Jun 01 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
Aug 17 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
May 08 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
Oct 16 Javascript
vue src动态加载请求获取图片的方法
Oct 17 Javascript
Seajs源码详解分析
Apr 02 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
路政管理专业推荐信
2013/11/11 职场文书
中级会计职业生涯规划范文
2014/01/16 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
后天观后感
2015/06/08 职场文书