关于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中的for in循环和hasOwnProperty结合使用
Jun 05 Javascript
js中window.open()的所有参数详细解析
Jan 09 Javascript
javascript中match函数的用法小结
Feb 08 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
Jun 01 Javascript
JavaScript脚本库编写的方法
Dec 09 Javascript
JQuery Ajax WebService传递参数的简单实例
Nov 02 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
Feb 18 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
Jan 16 Javascript
vue语法自动转typescript(解放双手)
Sep 18 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
Aug 27 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 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 文本文件的读取效率
2012/02/10 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
python 实现二维列表转置
2019/12/02 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
职称自我鉴定
2013/10/15 职场文书
应届大专生自荐书
2014/06/16 职场文书
世博会口号
2014/06/20 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
重阳节慰问信
2015/02/15 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers