这个Array.prototype和绑定组合如何替换这个箭头函数

时间:2018-03-11 23:27:40

标签: javascript ecmascript-6 bind arrow-functions

我正在阅读: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函数中作为参数?

3 个答案:

答案 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关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。