关于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 鼠标滚轮事件
Apr 09 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
Mar 24 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
Aug 15 Javascript
使用时间戳解决ie缓存的问题
Aug 20 Javascript
每天一篇javascript学习小结(属性定义方法)
Nov 19 Javascript
js实现的二分查找算法实例
Jan 21 Javascript
12个非常实用的JavaScript小技巧【推荐】
May 18 Javascript
利用BootStrap弹出二级对话框的简单实现方法
Sep 21 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
vue增加强缓存和版本号的实现方法
May 01 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 Javascript
Electron + vue 打包桌面操作流程详解
Jun 24 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 && 逻辑与运算符使用说明
2010/03/04 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
python批量提交沙箱问题实例
2014/10/08 Python
Python中处理时间的几种方法小结
2015/04/09 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
母亲节感恩活动记录
2014/03/16 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书
2015元旦感言
2015/12/09 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏