JavaScript中使用bind()方法

转载 2016年08月16日 16:44:03

什么是bind()?


bind函数最近才添加到JavaScript的规范说明中,所以它只能工作于最新的浏览器上。你可以查看兼容性表看看哪些浏览器实现bind()以及其他JavaScript功能。我仔细地看了看名单,我关注的浏览器没有不支持bind()的。当然你的情况可能会有所不同。


bind所做的就是自动封装函数在函数自己的闭包中,这样我们可以捆绑上下文(this关键字)和一系列参数到原来的函数。


你最终得到的是另一个函数指针。

function add(a,b){ 
   return a + b; }
var newFoo = add.bind(this,3,4);

请注意,我们不仅捆绑this到foo()函数,而且我们也捆绑了两个参数。所以,当我们调用newFoo()的时候,返回值将是7。


但是,如果我们在调用之前newFoo更改的参数的话,会发生什么?


更改bind参数


如果我们使用变量绑定参数到foo(),然后在调用newFoo()前改变变量,你觉得值会变为什么呢?

function add(a,b){    
   return a + b; }
var a = 3;
var b = 4;var newFoo = add.bind(this,a, b); a = 6; b = 7;
console.log(newFoo());

返回值仍然是7,因为bind()绑定的是参数的值,而不是实际变量的值。


这是好消息,就像我说的,我们可以在代码中利用这个巨大的优势。但是,对我而言它最有用的地方是在callbacks中。


bind和callbacks


还记得那篇文章中我们在循环中处理callbacks的解决方案之一就是,围绕我们想要调用的函数创建匿名函数。

for(var i = 0;i < 10;i++){
    (function(ii){
        setTimeout(function(){            
           console.log(ii);        },1000);    })(i);

但是我们可以使用bind,大大简化代码。

function consoleLog(i){  
 console.log(i); }
for(var i = 0;i < 10;i++){    setTimeout(consoleLog.bind(this,i),1000); }

这是因为每次调用bind就会给出一个新的函数指针,并且保留原来的函数不变。


同时,我们还删除了linting错误“不要在循环写函数”,因为我们不是在循环中创造的函数,我们只是指向了我们在循环外创建的函数。


bind用于事件处理程序


bind()可以让你的代码干净起来的另一个地方是在事件处理程序。大家都知道,或者应该知道,当一个事件处理程序被调用时,它访问的上下文会生成事件,而不是在创建事件处理程序的对象中。通过使用bind,可以肯定的是,函数会被访问正确的上下文。

function ClassName(){
  this.eventHandler = (function(){   }).bind(this); }

不是说你要像那样写代码,这只是为了说明要点。


Currying


什么?!

OK。我会是第一个承认,自己的函数式编程知识是有限的。我能给出的关于Currying的最佳定义是,它允许你在多个步骤中传递参数。


使用bind,我们就可以像这样写代码实现Currying:

function add(a,b,c) {
 return a+b+c; }
var addAgain = add.bind(this, 1, 2);
var result = addAgain(3);

相关文章推荐

Javascript通过bind()掌控this

     最近博客的更新明显跟不上脚步,不是因为最近什么都没看不知道写什么,而是因为最近工作比较忙看了好多东西以至于一时无从下手。东西要整理的太多了,还有很多不足啊,给自己打打气,一点点来~不能...
  • rznice
  • rznice
  • 2014年05月18日 10:59
  • 36930

C++标准库bind函数

上篇博客在为大家介绍lambda是先由find_if函数引入问题,由于find_if函数的第三个参数所要求的可调用对象只能由一个谓词,所以我们最后选择的解决方法是用lambda表达式。那么此问题还有其...

JS中的call、apply、bind方法详解

一、call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调...
  • hj7jay
  • hj7jay
  • 2016年12月13日 14:31
  • 838

JS中的bind方法与函数柯里化

绑定函数bind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值。...
  • y_xiao_
  • y_xiao_
  • 2016年02月15日 22:37
  • 2424

[原创]js中的bind("input")事件兼容ie8,9

项目的查询表单从回车键监听 $('#keyValue').keydown(function(e) { //Enter to search. var key = e.keyCode; if...

[Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA 密钥

RSA 是一种公钥加密算法,在 1977 年由麻省理工学院的%26nbsp;Ron Rivest, Adi Shamir, Leonard Adleman 三人一起提出,因此该算法命名以三人姓氏首字母...

苹果开发者查看账号到期时间及续费网址

1、打开development.apple.com 2、选择member center输入账号和密码  3、点击账户 在memberships目录下能看到账号到期时间,英文为expiration ...

JavaScript 中apply()、call()和bind()方法的使用

apply()和call()我们可以将call()和apply()看做是某个对象的方法,通过调用此方法来简介调用函数。 call()和apply()两个方法实际上差别不大,只是在方法的第二个参数类别...
  • sf_cyl
  • sf_cyl
  • 2016年07月25日 23:17
  • 237

JavaScript方法call,apply,caller,callee,bind的使用详解及区别

一、call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容)。 即  “某个方法”当做“指定的某个对象”的“方法”...
  • xxb2008
  • xxb2008
  • 2012年08月14日 09:13
  • 7520

Javascript中bind()方法的使用与实现

在讨论bind()方法之前我们先来看一道题目:var altwrite = document.write; altwrite("hello"); //1.以上代码有什么问题 //2.正确操作是怎样的 ...
  • pxzsl
  • pxzsl
  • 2015年08月17日 17:35
  • 343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaScript中使用bind()方法
举报原因:
原因补充:

(最多只允许输入30个字)