bind&currying
1. bind
- 基本用法
bind()是ECMAScript5中新增的方法,这个方法主要作用是将函数绑定至某个对象。当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新函数,这个新函数与原函数f()的区别仅仅是this参数指向了一个特定对象o。
实例如下:
function f(y){ return this.x + y; } var obj = {x: 1}; var newFun = f.bind(obj); newFun(2);//=>3
模拟基本用法:
if(!Function.prototype.bind){ Function.prototype.bind = function(/*o*/){ var obj = arguments[0]; var selfFun = this; return function(/*args*/){ return selfFun.apply(obj, arguments); }; }; } function f(y){return this.x + y} var obj = {x: 1}; var newFun = f.bind(obj); console.log(newFun(2));//=>3
- currying
什么是柯里化?如果你固定一个函数的某些参数,将得到接受余下参数的一个新函数。ECMAScript5中得bind()方法不仅仅能够将某个函数中的this绑定至特定对象,还可以将函数的形参绑定到特定值。bing()的这种应用方式成为柯里化(curring)。
例子如下:
var sum = function(x, y){return x + y + this.z}; var obj = {z: 1}; var newFun = sum.bind(obj, 1); console.log(newFun(1));//=>3
模拟currying用法:
if(!Function.prototype.bind){ Function.prototype.bind = function(/*o, args*/){ //保存要绑定的函数 var selfFun = this; //保存绑定的实参 var obj = arguments[0];//将第一个参数绑定到this var boundArgs = arguments;//将后面的参数绑定到函数的前面几个参数 //bind方法返回一个函数(闭包) //这个闭包要访问外部函数中的selfFun, boundArgs, obj. return function(/*argsLeft*/){ var args = [];//创建实参数组 var i; for(i = 1; i < boundArgs.length; i++){//push绑定的实参 args.push(boundArgs[i]); } for(i = 0; i < arguments.length; i++){//push剩余实参 args.push(arguments[i]); } //闭包内要访问外部函数内定义的变量 return selfFun.apply(obj, args); }; } } function sum(x, y){return x + y + this.z}; var obj = {z: 1}; var newFun = sum.bind(obj, 1); console.log(newFun(1));//=>3