关于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 cookie操作代码
Mar 14 Javascript
JavaScript版的TwoQueues缓存模型
Dec 29 Javascript
JavaScript原生对象之Date对象的属性和方法详解
Mar 13 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 Javascript
利用Vue.js指令实现全选功能
Sep 08 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
通过jsonp获取json数据实现AJAX跨域请求
Jan 22 Javascript
无限循环轮播图之运动框架(原生JS实现)
Oct 01 Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 Javascript
js实现验证码干扰(动态)
Feb 23 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
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
鼠标经过的文本框textbox变色
2009/05/21 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
Python常用随机数与随机字符串方法实例
2015/04/09 Python
Python单链表简单实现代码
2016/04/27 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python字符串与url编码的转换实例
2018/05/10 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
PyQt5响应回车事件的方法
2019/06/25 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
物业消防安全责任书
2014/07/23 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
英语复习计划
2015/01/19 职场文书
教师网络培训心得体会
2016/01/09 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技