关于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 相关文章推荐
使用户点击后退按钮使效三行代码
Jul 07 Javascript
jQuery 联动日历实现代码
May 31 Javascript
jQuery实现用方向键控制层的上下左右移动
Jan 13 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
jquery日历插件datepicker用法分析
Jan 22 Javascript
JS获取随机数和时间转换的简单实例
Jul 10 Javascript
JavaScript利用闭包实现模块化
Jan 13 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
Jan 22 Javascript
基于JavaScript实现单例模式
Oct 30 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
Dec 06 Javascript
vue实现移动端input上传视频、音频
Aug 18 Javascript
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
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 substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
php字符串过滤与替换小结
2015/01/26 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
php实现小程序支付完整版
2018/10/09 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Python3生成手写体数字方法
2018/01/30 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
班主任工作年限证明
2014/01/12 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
公司收款委托书范本
2014/09/20 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
党员转正大会主持词
2015/07/02 职场文书
公司开业主持词
2015/07/02 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书