关于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 UI皮肤定制
Jul 27 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
Nov 07 Javascript
JavaScript数组对象赋值用法实例
Aug 04 Javascript
原生js的RSA和AES加密解密算法
Oct 08 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
Dec 26 Javascript
基于JavaScript实现滑动门效果
Mar 16 Javascript
weebox弹出窗口不居中显示的解决方法
Nov 27 Javascript
node打造微信个人号机器人的方法示例
Apr 26 Javascript
jQuery zTree插件使用简单教程
Aug 16 jQuery
layui自定义工具栏的方法
Sep 19 Javascript
使用Typescript和ES模块发布Node模块的方法
May 25 Javascript
vue 如何从单页应用改造成多页应用
Oct 23 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变量的值类型和引用类型
2015/10/21 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
php桥接模式应用案例分析
2019/10/23 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
python中几种自动微分库解析
2019/08/29 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
keras 多任务多loss实例
2020/06/22 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
IRO美国官网:法国服装品牌
2018/03/06 全球购物
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
应届大学生自荐信
2013/12/05 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
大学班级学风建设方案
2014/05/01 职场文书
办理房产过户的委托书
2014/09/14 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
物业工程部岗位职责
2015/02/11 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
写给同事的离职感言
2015/08/04 职场文书
企业内部管理控制:银行存款控制制度范本
2020/01/10 职场文书