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方法的特性, 這種技術也被稱爲函數柯里化。對象

相關文章
相關標籤/搜索