关于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支持firefox,ie7页面布局拖拽效果代码
Dec 20 Javascript
js实现连个数字相加而不是拼接的方法
Feb 23 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
Dec 22 Javascript
原生js实现电商侧边导航效果
Jan 19 Javascript
jQuery实现checkbox的简单操作
Nov 18 jQuery
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 Javascript
extract-text-webpack-plugin用法详解
Feb 14 Javascript
一个手写的vue放大镜效果
Aug 09 Javascript
如何手写简易的 Vue Router
Oct 10 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
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 远程关机实现代码
2009/11/10 PHP
php防止sql注入代码实例
2013/12/18 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
validator验证控件使用代码
2010/11/23 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
全面分析Python的优点和缺点
2018/02/07 Python
python实现定时提取实时日志程序
2018/06/22 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
python学生管理系统开发
2019/01/30 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
机关保密承诺书
2014/06/03 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
师德承诺书2015
2015/04/28 职场文书
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技