js函数柯里化,实现bind
1、柯里化:
把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
举个栗子:
一个计算两数之和的函数,需要传递两个参数,柯里化后,这个方法只接受一个参数,但是返回一个函数,用来接收第二个参数
function add(a,b){ return a+b; } //柯里化后 function add(a){ return function(b){ return a+b; } } //调用 add(1)(2) //3
柯里化实际上是使用的闭包原理。
2、实现 add(1)(2)(3,4,5)
function add(){ var args = [].slice.call(arguments);//将参数复制到新的变量中 var adder = function(){ [].push.apply(args,[].slice.call(arguments));//args被内部函数引用,形成闭包 return adder; } adder.toS = function(){ //将所有输入的参数累加 return args.reduce(function(a,b){ return a+b; }) } return adder();//此时要执行一次 } console.info(add(1,2,3)(4,5)(6).toS()) //21
3、利用柯里化实现js的bind方法
js的call,apply,bind方法的具体使用和区别可以到这位同学的博文里(https://www.cnblogs.com/libin-1/p/6069031.html),写的很详细。
柯里化可以延迟执行某个函数,所以调用bind方法时不是立即执行的。
Function.prototype.b=function(){ var args = [].slice.apply(arguments); var scope = args.slice(0,1);//传入的作用域 var params = args.slice(1);//传入的参数
var self = this;
return function(){ //此时的this为调用b时的方法 return self.apply(scope[0],params); } } function c(){ return this.name; } //注意bind后要再执行一次,因为bind()不会立即执行需要绑定作用域的方法 console.info(c.b({name:'123'})()) //123