关于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 相关文章推荐
jquery 经典动画菜单效果代码
Jan 26 Javascript
JS保存、读取、换行、转Json报错处理方法
Jun 14 Javascript
jquery eval解析JSON中的注意点介绍
Aug 23 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
Feb 23 Javascript
js判断浏览器类型及设备(移动页面开发)
Jul 30 Javascript
尝试动手制作javascript放大镜效果
Dec 25 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
Jun 24 Javascript
javascript中递归的两种写法
Jan 17 Javascript
JS实现颜色动态淡化效果
Mar 06 Javascript
es6在react中的应用代码解析
Nov 08 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
vue路由教程之静态路由
Sep 03 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
安装APACHE
2007/01/15 PHP
有关PHP中MVC的开发经验分享
2012/05/17 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
jqgrid 表格数据导出实例
2013/11/21 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
AngularJS实现ajax请求的方法
2016/11/22 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python编程中time模块的一些关键用法解析
2016/01/19 Python
用python实现的线程池实例代码
2018/01/06 Python
python模块之paramiko实例代码
2018/01/31 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
django中间键重定向实例方法
2019/11/10 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
大学生的四年学习自我评价
2013/12/13 职场文书
保护环境建议书100字
2014/05/13 职场文书
党员进社区活动总结
2015/05/07 职场文书
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
Python OpenCV之常用滤波器使用详解
2022/04/07 Python