你不知道的js书中有下面这段代码,当时看的时候有种云里雾里的感觉,在这里记录一下自己的理解
一般我们会使用bind方法,实现函数this的重新绑定,并且可以柯里化传参,或者使用apply方法,马上执行一个函数并且给这个立即执行的函数指定一个this,传参则是数组形式。
下面这段代码我理解为,正常使用apply,是立即执行,但是加上了bind,函数就不会立即执行,反而是给Function绑定了this,this在这里为fn,然后结合apply的数组传参性质,使fn可以接受数组传参
function spread(fn) {
return Function.apply.bind(fn, null);
}
fn以test函数为例
function test(x, y) {
console.log(`x = ${x}, y = ${y}`);
}
正常调用test函数,传参应该是1,2这样
test(1, 2);
如果通过调用spread函数调用, 就可以这样写,可以看到,现在接收参数的形式从1,2变为了[1,2],输出结果则为 x = 1, y = 2
spread(test)([1, 2])
其实也就是相当于,这样可能好理解一些
function spread(fn) {
return (v) => fn.apply(null, v);
}
spread(test)([1,2])
所以费了这么大劲,其实ES6中早就有了应对方法,就是解构(再次感叹ES6的便捷性)
function test([x, y]) {
console.log(`x = ${x}, y = ${y}`);
}
test([1, 2]);
所有提到的代码,只是在书中特定情况下使用