鉴于文件
bind()方法创建一个新函数,当被调用时,它具有它 此关键字设置为提供的值,具有给定的序列 调用新函数时提供的任何参数。
我目前正在关注使用node.js创建区块链的教程
但是我在以下示例中不明白(我在下面的教程中提供的代码)是为什么我应该绑定关键字' 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)的目的,所以如果你能指出我误解的内容会很好。
谢谢:)
答案 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
的运行时绑定规则仍然适用于新的类语法。希望它有所帮助。