使用方便有用的方法,以减少代码行数,提高我们的工作效率,增加我们的摸鱼时间。
call 方法
功能:给定一个键和一组参数,当给定一个上下文时调用它们。
有点抽象,稍后我们看看示例讲解。
实现
const call = (key, ...args) => context => context[key](...args);
使用一个闭包来调用带有给定上下文的args
的key
。
示例
Promise.resolve([1, 2, 3])
.then(call('map', x => 2 * x))
.then(console.log); // [ 2, 4, 6 ]
说明一下:
首先看 call('map', x => 2 * x)
,它执行的结果返回一个函数,把参数带入进去得:
context => context['map'](x => 2 * x)
我们暂且把它命名为 x,即x = context => context['map'](x => 2 * x)
,代入 promise 中
Promise.resolve([1, 2, 3]).then(x).then(console.log)
我们 then
的第一个参数表示 resolve 返回的的结果,即 [1, 2, 3]
,而
x 函数参数一个 context
的参数,所以此时的 context
的值为 [1, 2, 3]
,代入得
[1, 2, 3]['map'](x => 2 * x)
所以的结果是 [ 2, 4, 6 ]
,再把此结果返回给第二个 then
方法,所以console.log
的结果是 [ 2, 4, 6 ]
。
还可以这么写
const map = call.bind(null, 'map');
Promise.resolve([1, 2, 3])
.then(map(x => 2 * x))
.then(console.log); // [ 2, 4, 6 ]
bind
的作用是改变 this
指向并返回一个函数,第二个参数及第三个参数等就是所改变的函数参数。
const map = call.bind(null, 'map')
等价于 const map = ('map', ...args) => context => context['map'](...args)
接下来在再我们上面分析的一样代入即可,所以得的结果还是一样的。