我正在阅读:https://hackernoon.com/functional-javascript-resolving-promises-sequentially-7aac18c4431e
在一节中,作者讨论了用
替换第二个箭头函数Promise.resolve([])
.then(all => funcs[0].then(result => all.concat(result)))
此
Promise.resolve([])
.then(all => funcs[0].then(Array.prototype.concat.bind(all)))
我无法理解其工作原理...返回的结果是否隐式添加到concat函数中作为参数?
答案 0 :(得分:1)
whatEverMethod.bind(thisValue)
将this
绑定到thisValue
。
要理解,我们可以假设(虽然不是实际)每个方法调用
obj.method(arg0)
等于
obj.method.apply(obj, arg0)
.apply
的第一个参数明确告诉我:我正在处理哪个对象(因为可能在.method
的定义中,您可以引用某些this
值,例如{{ 1}})
this.prop0 = 10
的作用非常简单:将bind
值绑定到方法调用,以便在调用时,不再使用基于环境的默认this
值。
例如:
this

因此,
let obj0 = {a: 1}
let obj1 = {a: 2}
obj0.change = function(value) {
this.a = value;
} // when declared, default environment is obj0, since it is a method of obj0
// Now, explicitly bind `this` inside of obj0.change to obj1
let changeFunc = obj0.change.bind(obj1);
// This creates a function that has `this` set to obj1, which has the format changeFunc(value)
changeFunc(10);
console.log(obj1.a) // should be 10, since it is now operating on obj1 (due to binding)

我们可能想要这样做的原因可能是(Array.prototype.concat.bind(all))(someArr)
// is basically
all.concat(someArr)
// due to having the exactly the same `this` value
可能不是数组。例如,它可能是一个类似于数组的对象,例如函数的all
,它看起来像一个数组,但缺少常见的数组方法。
答案 1 :(得分:0)
bind
对函数进行操作,获取this
的值并返回一个新函数,该函数使用指定的this
值和相同的参数¹调用原始函数。换句话说,
Array.prototype.concat.bind(all)
装置
(...args) => Array.prototype.concat.call(all, ...args)
是
(...args) => all.concat(...args)
并且由于传递了一个参数,那就是
result => all.concat(result)
顺便说一下,没有理由不在这里写箭头功能。它更清晰,没有任何缺点。
¹它也可以添加参数。
答案 2 :(得分:0)
then
会收到函数/回调。bind
返回将特定对象附加为上下文this
的函数。 Array.prototype.concat.bind(all))
^
|
+---- This object 'all' will be the context
'this' for the function 'concat'.
因此,函数then
将调用callback
(隐式传递all
对象),这是函数bind
返回的新函数,在这种情况下,来自Array原型的函数concat
。
Function.prototype.bind()
bind()
方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。