关于Function中的bind()示例详解


Posted in Javascript onDecember 02, 2016

前言

bind()接受无数个参数,第一个参数是它生成的新函数的this指向,比如我传个window,不管它在何处调用,这个新函数中的this就指向window,这个新函数的参数就是bind()的第二个、第三个、第四个....第n个参数加上它原本的参数。(行吧,我自己都蒙圈了)

示例介绍

我们还是看看栗子比较好理解,举个bind()最基本的使用方法:

this.x = 9; 
var module = {
 x: 81,
 getX: function() { return this.x; }
};

module.getX(); // 返回 81

var retrieveX = module.getX;
retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域

// 创建一个新函数,将"this"绑定到module对象
// 新手可能会被全局的x变量和module里的属性x所迷惑
var boundGetX = retrieveX.bind(module);
boundGetX(); // 返回 81

这里很明显,我们在window对象下调用retrieveX,得到的结果肯定是window下的x,我们把module对象绑定到retrieveXthis上,问题就解决了,不管它在何处调用,this都是指向module对象。

还有bind()的其他参数,相信第一次接触bind()的朋友看到上面的定义都会蒙圈。

还是举个栗子:

function list() {
 return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

// 创建一个拥有预设初始参数的函数
var leadingThirtysevenList = list.bind(undefined,[69,37],{a:2});

var list2 = leadingThirtysevenList(); // [[69,37],{a:2}]
var list3 = leadingThirtysevenList(1, 2, 3); // [[69,37],{a:2}, 1, 2, 3]

list函数很简单,把传入的每个参数插入到一个数组里,我们用bind()list函数设置初始值,因为不用改变listthis的指向,所以直接传undefined,从第二个参数开始,就是要传入list函数的值,list2list3的返回值很好的说明了一切。

我自己一般使用的bind()的场景是配合setTimeout函数,因为在执行setTimeout时,this会默认指向window对象,在使用bind()之前,我是这么做的:

function Coder(name) {
  var that = this;
  that.name = name;
  that.getName = function() {
   console.log(that.name)
  };
  that.delayGetName = function() {
   setTimeout(that.getName,1000)
  };
 }
 var me = new Coder('Jins')
 me.delayGetName()//延迟一秒输出Jins

在函数内顶层定义一个that缓存this的指针,这样不论怎么调用,that都是指向 Coder的实例,但是多定义一个变量总是让人不太舒服。

使用bind()就简单多了:

function Coder(name) {
  this.name = name;
  this.getName = function() {
   console.log(this.name)
  };
  this.delayGetName = function() {
   setTimeout(this.getName.bind(this),1000)
  };
 }
 var me = new Coder('Jins')
 me.delayGetName()//延迟一秒输出Jins

这样就OK了,直接把setTimeoutthis绑定到外层的this,这肯定是我们想要的!

最后附上参考地址:

Function.prototype.bind()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JScript内置对象Array中元素的删除方法
Mar 08 Javascript
JQueryEasyUI Layout布局框架的使用
Apr 08 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
jQuery中:contains选择器用法实例
Dec 30 Javascript
基于jquery实现在线选座订座之影院篇
Aug 24 Javascript
jQuery实现的可编辑表格完整实例
Jun 20 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
Sep 23 Javascript
AngularJS中isolate scope的用法分析
Nov 22 Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 Javascript
angularJs中$scope数据序列化的实例
Sep 30 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 Javascript
JavaScript Canvas编写炫彩的网页时钟
Oct 16 Javascript
bootstrap模态框消失问题的解决方法
Dec 02 #Javascript
谈谈因Vue.js引发关于getter和setter的思考
Dec 02 #Javascript
jquery获取input type=text中的值的各种方式(总结)
Dec 02 #Javascript
vue.js入门(3)——详解组件通信
Dec 02 #Javascript
javascript实现鼠标点击页面 移动DIV
Dec 02 #Javascript
jquery对所有input type=text的控件赋值实现方法
Dec 02 #Javascript
bootstrap使用validate实现简单校验功能
Dec 02 #Javascript
You might like
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
php简单判断文本编码的方法
2015/07/30 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
python备份文件的脚本
2008/08/11 Python
Python代码调试的几种方法总结
2015/04/15 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
大四自我鉴定范文
2013/10/06 职场文书
军训心得体会
2013/12/31 职场文书
优秀员工获奖感言
2014/03/01 职场文书
cf收人广告词大全
2014/03/14 职场文书
股权收购意向书
2014/04/01 职场文书