关于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 相关文章推荐
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
Node.js的包详细介绍
Jan 14 Javascript
jQuery+PHP实现动态数字展示特效
Mar 14 Javascript
JavaScript返回网页中超链接数量的方法
Apr 03 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
微信小程序之页面跳转和参数传递的实现
Sep 29 Javascript
js代码规范之Eslint安装与配置详解
Sep 08 Javascript
redux.js详解及基本使用
May 24 Javascript
Vue打包后访问静态资源路径问题
Nov 08 Javascript
JS如何使用剪贴板操作Clipboard API
May 17 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开源XNA 聚合程序发布 下载
2007/07/13 PHP
PHP如何将XML转成数组
2016/04/04 PHP
JavaScript 乱码问题
2009/08/06 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
Sea.JS知识总结
2016/05/05 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
vuex实现购物车功能
2020/06/28 Javascript
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
美发店5.1活动方案
2014/01/24 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
家长通知书家长意见
2014/12/30 职场文书
万能检讨书
2015/01/27 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
李强为自己工作观后感
2015/06/11 职场文书
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python