js bind es5函数柯里化

绑定函数

bind()最简单的用法是建立一个函数,使这个函数不论怎么调用都有一样的this值。常见的错误就像上面的例子同样,将方法从对象中拿出来,而后调用,而且但愿this指向原来的对象。函数

若是不作特殊处理,通常会丢失原来的对象。使用bind()方法可以很漂亮的解决这个问题:this

 
this.num = 9; 
var mymodule = {
  num: 81,
  getNum: function() { return this.num; }
};

module.getNum(); // 81

var getNum = module.getNum;//把对象中的方法提取出来,这是方法中的this指向改变为global,想要这个方法的this依然指向mymodule就须要使用bind绑定函数,固然也可使用call方法
getNum(); // 9, 由于在这个例子中,"this"指向全局对象

// 建立一个'this'绑定到module的函数
var boundGetNum = getNum.bind(module);
boundGetNum(); // 81

 bind()方法所返回的函数的length(形参数量)等于原函数的形参数量减去传入bind()方法中的实参数量(第一个参数之后的全部参数),由于传入bind中的实参都会绑定到原函数的形参,吗的,绕死了, 举个栗子:spa

function  func(a,b,c,d){...} //func的length为4

var after = func.bind(null,1,2)  //这里输入了两个实参(1,2)绑定到了func函数的a,b

console.log(after.length) //after的length为 2
after =after .bind(null,3) //这里输入了两个实参(3)绑定到了after函数的c
console.log(after.length) //after的length为 1
 

当bind()所返回的函数用做构造函数的时候, 传入bind()的this将被忽略,实参会所有传入原函数code

function original(x){
  this.a=1;
  this.b =function(){return this.a + x}
}
var obj={
  a:10
}
var  newObj = new (original.bind(obj,2)) //传入了一个实参2
console.log(newObj.a)  //输出 1, 说明返回的函数用做构造函数时obj(this的值)被忽略了

console.log(newObj.b()) //输出3 ,说明传入的实参2传入了原函数original

 

以上就是ES5中bind方法的特性, 这种技术也被称为函数柯里化。对象

相关文章
相关标签/搜索