JavaScript
中的参与者模式,就是在特定的作用域中执行给定的函数,并将参数原封不动的传递,参与者模式不属于一般定义的23
种设计模式的范畴,而通常将其看作广义上的技巧型设计模式。
参与者模式实现的在特定的作用域中执行给定的函数,并将参数原封不动的传递,实质上包括函数绑定和函数柯里化。
对于函数绑定,它将函数以函数指针(函数名)的形式传递,使函数在被绑定的对象作用域中执行,因此函数的执行中可以顺利地访问到对象内部的数据,由于函数绑定构造复杂,执行时需要消耗更多的内存,因此执行速度上要稍慢一些,不过相对于解决的问题来说这种消耗还是值得的,因此它常用于事件,setTimeout
或setInterval
等异步逻辑中的回调函数。
当我们需要为元素添加事件时,可以封装一个兼容的方法。
这样对于事件绑定是完全可以的,但是我们不能传入一些参数以保持回调函数内部的词法作用域的数据的完整性,所以我们在回调函数中下点文章。
这样又导致了新问题,添加的事件回调函数不能移除了,所以还需要对其改进,使用bind
改变绑定函数的this
,实际上就是形成了一个闭包,现在bind
普遍都在Function.prototype
上实现了,但是在一些低版本浏览器还是需要自行实现,我们自行实现一个bind
。
尝试使用bind
绑定this
,接下来我们在事件绑定中就可以传递使用bind
绑定的函数了。
我们可以继续完善bind
,bind
实际上是可以保存部分参数的,这时我们可以借助函数柯里化的思想将参数分开实现,当然直接使用ES6
的...
操作符也是可以直接实现的。柯里化Currying
是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术,是函数式编程应用。
实际上不光在事件绑定的时候我们使用到bind
绑定作用域,在使用观察者模式时订阅的过程通常也是传递了一个绑定好的函数。