关于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 相关文章推荐
javascript解决innerText浏览器兼容问题思路代码
May 17 Javascript
JS的get和set使用示例
Feb 20 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
Nov 26 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
Jan 26 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
Jan 17 Javascript
Ionic3 UI组件之Gallery Modal详解
Jun 07 Javascript
Vue.js移动端左滑删除组件的实现代码
Sep 08 Javascript
在React 组件中使用Echarts的示例代码
Nov 08 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
简单理解Vue中的nextTick方法
Jan 30 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
Feb 27 Javascript
详解ES6 中的Object.assign()的用法实例代码
Jan 11 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 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
JavaScript 函数式编程的原理
2009/10/16 Javascript
jQuery 操作option的实现代码
2011/03/03 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
七一建党日演讲稿
2014/09/05 职场文书
放假通知
2015/04/14 职场文书
社区党建工作总结2015
2015/05/13 职场文书