博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于javascript中的bind、call、apply等函数的用法
阅读量:6996 次
发布时间:2019-06-27

本文共 1690 字,大约阅读时间需要 5 分钟。

关于javascript中的bind、call、apply等函数的用法

我GitHub上的菜鸟仓库地址:
文章在我的博客上的地址:

        前面的文章已经说到this的指向了,那么这篇文章就要说一说和this相关的三个函数的用法:bind( )、call( )和apply( )。

        其实它们都很简单,但是在处理一些与this相关的函数的时候,用来改变函数中this的指向,却是必不可少的工具,所以必须掌握好它们的用法。

        好了,三管齐下,一起比较地举例子说一下:

//先来一个对象big吧var big = {    name:'BaBa',    saying:function (age){        console.log(this.name,'age:',age);    }};//再来一个small对象var small= {    name:'ErZi'};//如果想调用big的saying方法来说出‘Erzi’://使用bind方法big.saying.bind(small)(20);//打印结果为ErZi age: 20//使用call方法big.saying.call(small,20);//打印结果为ErZi age: 20//使用apply方法big.saying.apply(small,[20]);//打印结果为ErZi age: 20

        所以,其实三种方法都可以达到同一个结果,至于区别就很显而易见了。

        bind只是单纯将一个函数里的this的指向明确指定为small了,如果要执行函数,就要在后面加括号调用了。

        call就是直接执行一个自己指定this指向的函数,参数是一个一个传递。

        apply和call的区别就是,参数是放进一个数组中传递。

        实际上,很多时候我们在一个函数中,想用到其他的函数,但是其他函数的this指向就不明确,所以就会在自己的函数里面通过这三个方法来调用函数,例如:

//先来一个对象big吧var big = {    name:'BaBa',    age:50,    saying:function (){        console.log(this.name,'age:',this.age);    }};//再来一个SayingAge的构造函数function SayingAge(name,age){    this.name = name;    this.age = age;    this.saying = big.saying.bind(this);}//实例化一个对象geniusvar genius = new SayingAge('tiancai',18);//调用genius的saying方法genius.saying();//打印结果为tiancai age: 18

        构造函数SayingAge就是将big的saying方法拿过来,并将saying函数里面的this指向改为自己的this指向(指向实例化的对象)。

        如果想不单单是bind了一个函数的this指向,还想执行它,举个call的例子(apply只是将参数放进数组):

//先来一个对象big吧var big = {    name:'BaBa',    age:50,    saying:function (sex){        console.log(this.name,'age:',this.age,'sex:',sex);    }};//再来一个small对象var small = {    name:'ErZi',    age:18};//借用big的saying方法看看small的saying是什么big.saying.call(small,'male');//打印结果为ErZi age: 18 sex: male

        当然了,这个方法并没有给small添加了saying方法,只不过调用了big的saying方法,并将里面的this指向small而已。

        相信大家对这三个方法的应用都很轻松掌握了。

转载地址:http://lydvl.baihongyu.com/

你可能感兴趣的文章
分享30套免费的高质量网页按钮素材
查看>>
亲测SQLServer的最大连接数 (转)
查看>>
typeof 运算符用法
查看>>
SignalR 0.5 发布了
查看>>
批量照片缩小器展示多线程控件BackgroundWorker后台工作使用方法
查看>>
HTML5之Canvas绘图——Canvas画布调整之移动、缩放、旋转
查看>>
排查数据库性能的常用sql语句
查看>>
全排列
查看>>
Node.js&NPM的安装与配置(转)
查看>>
C# CRC16 查表法
查看>>
js中获取键盘事件
查看>>
面试(4)-spring-Spring面试题和答案
查看>>
请教 JTable 里的单元格如何使得双击进入单元格后,单元格的内容处于全选中状态...
查看>>
jQuery 各类判断函数汇总
查看>>
Android studio 分32位64位版本吗?
查看>>
UIcollectionView的使用(首页的搭建1)
查看>>
[原创]AM3352 + TPS65910 调试方法+调试记录
查看>>
.net基本数据类型操作
查看>>
docker 应用-2(Dockerfile 编写以及镜像保存提交)
查看>>
监控 Linux 性能的 18 个命令行工具
查看>>