关于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 相关文章推荐
YUI Compressor压缩JavaScript原理及微优化
Jan 07 Javascript
Javascript Object 对象学习笔记
Dec 17 Javascript
js检测判断日期大于多少天的方法
May 04 Javascript
javascript删除元素节点removeChild()用法实例
May 26 Javascript
jquery实现的3D旋转木马特效代码分享
Aug 25 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
JavaScript 详解预编译原理
Jan 22 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
Aug 19 Javascript
微信小程序页面间值传递的两种方法
Nov 26 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
Oct 12 Javascript
JavaScript实现下拉列表
Jan 20 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
详解php中的implements 使用
2017/06/13 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
js实现一个简易计算器
2020/03/30 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
Numpy之文件存取的示例代码
2018/08/03 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
详细分析Python collections工具库
2020/07/16 Python
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
大学毕业自我鉴定范文
2014/02/03 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
保护动物的标语
2014/06/11 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python