关于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 DOM写的类似微博发布的效果
Oct 20 Javascript
jQuery圆形统计图开发实例
Jan 04 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
基于slideout.js实现移动端侧边栏滑动特效
Nov 28 Javascript
谈谈jQuery之Deferred源码剖析
Dec 19 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
May 09 Javascript
vue服务端渲染缓存应用详解
Sep 12 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
Feb 28 Javascript
vue实现全屏滚动效果(非fullpage.js)
Mar 07 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日期函数date格式化UNIX时间的方法
2015/03/19 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
php 三大特点:封装,继承,多态
2017/02/19 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
设置python3为默认python的方法
2018/10/31 Python
微信小程序python用户认证的实现
2019/07/29 Python
python实现桌面气泡提示功能
2019/07/29 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
大学生农村教师实习自我鉴定
2013/09/21 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
爱心捐助倡议书
2014/05/19 职场文书
学习十八大的心得体会
2014/09/12 职场文书
赞助商致辞
2015/07/30 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
JavaScript ES6的函数拓展
2022/01/18 Javascript
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技