2015年5月20日 星期三

Javascript使用bind實現Curry ( Curry in JavaScript using bind )

Curry
  • 使用時機:呼叫某函式時,頻繁輸入相同多個相同參數。
  • 使用方式:利用部分應用的方式,傳入多個相同參數給函式,並動態產生新的函式,接下來都使用新的函式輸入一直改變得參數便可。
詳細解說請參考WIKI

例子1
function add( a, b, c ){
 return a+b+c;
}

原本的使用情境:
add( 1, 2, 3); //6
add( 1, 2, 4); //7
add( 1, 2, 8); //11

使用bind之後就會變成以下的使用方式:
var new_fn = add.bind( null, 1, 2 );
intermediate( 3 ); //6
intermediate( 4 ); //7
intermediate( 8 ); //11

例子2
function converter(toUnit, factor, offset, input) {
    offset = offset || 0;
    console.log("toUnit = " + toUnit); //"km"
    console.log("factor = " + factor); //1.60936
    console.log("offset = " + offset); //0
    console.log("input = " + input);   //10
    return [((offset+input)*factor).toFixed(2), toUnit].join(" ");
}
 
var milesToKm = converter.bind(undefined, 'km', 1.60936, 0);
milesToKm(10);  // returns "16.09 km"

例子3
詳細解說bind的參數功能:
var value = 8; 
var module = {
   value: 13,
   getValue: function(){ 
    return this.value; 
   }
};
var getModuleValue = module.getValue;
console.log( getModuleValue() ); // 8,因為這裡的this是指向全域的this

var getGlobalValue = getModuleValue.bind( null );
console.log( getGlobalValue() ); // 8, 因為第一個參數是null,所以this是指向全域的this
 
var getLocalValue = getModuleValue.bind( module );
console.log( getLocalValue() ); // 13,這裡的this是指向區域module的this

Ref : 
http://kishorelive.com/2012/02/06/currying-in-javascript-using-bind/
http://forsourcecode.blogspot.tw/2014/02/javascript-curry.html

0 意見:

張貼留言