关于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 相关文章推荐
区分JS中的undefined,null,"",0和false
Mar 08 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
Sep 12 Javascript
mailto的使用技巧分享
Dec 21 Javascript
html+css+js实现xp window界面及有关功能
Mar 26 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
Jun 14 Javascript
JavaScript中instanceof运算符的用法总结
Nov 19 Javascript
jQuery中siblings()方法用法实例
Jan 08 Javascript
JS数组的常见用法实例
Feb 10 Javascript
利用Vue.js实现checkbox的全选反选效果
Jan 18 Javascript
学好js,这些js函数概念一定要知道【推荐】
Jan 19 Javascript
如何使用Jquery动态生成二级选项列表
Feb 06 jQuery
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 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实现的获取URL信息的类
2007/01/02 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
PHP常用的三种设计模式
2017/02/17 PHP
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
详解python中的线程
2018/02/10 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python中logging日志库实例详解
2020/02/19 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
一套C#面试题
2013/10/09 面试题
小学教师师德感言
2014/02/10 职场文书
企业精神口号
2014/06/11 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
Elasticsearch 配置详解
2022/04/19 Java/Android
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle