关于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 相关文章推荐
各种常用浏览器getBoundingClientRect的解析
May 21 Javascript
JS模拟面向对象全解(一、类型及传递)
Jul 13 Javascript
利用jquery的获取JS文件中的字符串内容
Feb 14 Javascript
js复制到剪切板的实例方法
Jun 28 Javascript
js判断浏览器类型的方法
Aug 07 Javascript
JS截取字符串常用方法整理及使用示例
Oct 18 Javascript
js图片预加载示例
Apr 30 Javascript
jquery取子节点及当前节点属性值的方法
Sep 09 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
May 24 Javascript
基于jQuery实现仿微博发布框字数提示
Jul 27 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
vue addRoutes路由动态加载操作
Aug 04 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 curl选项列表(超详细)
2013/07/01 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
Convert Seconds To Hours
2007/06/16 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
跟老齐学Python之编写类之二方法
2014/10/11 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
给老师的检讨书
2014/02/11 职场文书
活动总结格式范文
2014/04/26 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
个人工作总结范文2014
2014/11/07 职场文书
公司周年庆寄语
2019/06/21 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang