关于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程序之undefined篇(中)
Nov 23 Javascript
JQuery中$之选择器用法介绍
Apr 05 Javascript
js setTimeout()函数介绍及应用以倒计时为例
Dec 12 Javascript
JavaScript类继承及实例化的方法
Jul 25 Javascript
window.onload使用指南
Sep 13 Javascript
基于javascript实现最简单的选项卡切换效果
May 16 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
原生JS改变透明度实现轮播效果
Mar 24 Javascript
详解React开发必不可少的eslint配置
Feb 05 Javascript
Node.js 的 GC 机制详解
Jun 03 Javascript
JavaScript使用canvas绘制随机验证码
Feb 17 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中header的用法详解
2013/06/07 PHP
PHP编写简单的App接口
2016/08/28 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
js获取url传值的方法
2015/12/18 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
Python中的引用和拷贝浅析
2014/11/22 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
通俗讲解python 装饰器
2020/09/07 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
自我评价怎么写好呢?
2013/12/05 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
安全保证书
2015/01/16 职场文书
运动会100米加油稿
2015/07/21 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
Python 全局空间和局部空间
2022/04/06 Python