为什么我应该在类中使用bind(this)?

时间:2018-05-06 19:24:42

标签: javascript

鉴于文件

  

bind()方法创建一个新函数,当被调用时,它具有它   此关键字设置为提供的值,具有给定的序列   调用新函数时提供的任何参数。

我目前正在关注使用node.js创建区块链的教程

https://developers.caffeina.com/chiccocoin-learn-what-is-a-blockchain-by-creating-one-in-nodejs-12929a89208b

但是我在以下示例中不明白(我在下面的教程中提供的代码)是为什么我应该绑定关键字' this &# 39;属于一个类的方法。鉴于 newBlock()功能属于区块链类,它应该可以访问' 这个'以及与 Blockchain 类相关的所有变量。

class Blockchain {
  constructor () {
    this.chain = []
    this.newBlock = this.newBlock.bind(this)
    this.newBlock(100, 1)
  }
  newBlock (proof, previousHash) {
    const block = this.chain.length + 1
  }
}

有没有人可以解释我为什么要将 bind(this )与类中的方法一起使用?实际上我有可能误解了 bind(this)的目的,所以如果你能指出我误解的内容会很好。

谢谢:)

2 个答案:

答案 0 :(得分:1)

Bind将创建该函数的副本,该副本将保证函数newBlock中“this”的引用将指向Blockchain。如果一个新函数(让我们称之为函数readBlocks)调用newBlock,那么这个上下文将指向readBlocks而不是Blockchain。绑定将允许您使用newBlock而不必担心它的上下文是动态的。

答案 1 :(得分:0)

类定义你在javascript中的做法,仍然在幕后做原型继承。这个类定义具有可塑性,您可以通过向其原型添加更多方法来添加更多方法。因此,对于使用函数完成的正常原型继承,class语法更像是语法糖(不完全,但对于大多数实际用途)。

鉴于背景,javascript中的this绑定始终在运行时完成(箭头函数除外)。调用特定方法的上下文确定this绑定。它在定义方法时没有约束。但是,如果您将方法预先绑定到特定上下文,那么该规则就不成立,就像您在.bind示例中所做的那样。

如果你还没有这样做,有人可以像这样调用newBlock方法

let a = new Blockchain()
let b = new Blockchain()

a.newBlock.call(b, proof, previousHash)

由于绑定是在运行时完成的,在上面的例子中,将使用this调用newBlock方法,引用对象b。但是,如果使用.bind预先绑定方法,则不会发生这种情况。

这很棘手。但主要的一点是,javascript中this的运行时绑定规则仍然适用于新的类语法。希望它有所帮助。