javascript - 为什么在构造函数内的函数中未定义“this”的值?
问题描述
出于实践目的,我正在尝试在 Node.js 中实现我自己的 Promise 版本。我得到了我不明白的结果。我创建了以下代码来显示我的问题所在。
class Person {
constructor(name) {
this.name = name
// console.log(this)
function sayName() {
console.log(this.name)
}
sayName()
}
}
const joe = new Person('Joe')
我收到错误消息'TypeError: Cannot read property 'name' of undefined'。当我调用构造函数时,'this' 的值是新创建的对象,所以如果我取消注释行,我会在该行注销正在创建的对象。
当我调用 sayName 函数时,我希望 'this' 的值是全局对象。在我见过的大多数情况下,可以安全地假设当您开始定义新函数时,“this”的值是全局对象。但在这里它是“未定义的”,因此我收到错误消息。
如果我在不使用 class 关键字的情况下执行相同的操作,并将 sayName 函数放入构造函数中,它会按预期运行,并记录“未定义”,因为在全局对象上没有定义名称属性。
function Person(name) {
this.name = name
function sayName() {
console.log(this.name)
}
sayName()
}
const joe = new Person('Joe')
我知道使用 class 关键字时会触发一些安全机制。我最好的猜测是,这两个示例之间的差异是其中一个在我不知情的情况下被触发。
请告诉我是什么导致了差异,为什么在第一个示例中未定义“this”的值!谢谢
解决方案
看起来函数声明在构造函数中定义时function() {}
会丢失上下文。this
我想这与constructor
幕后的实现方式有关。您可以将其添加回来
sayName = sayName.bind(this);
sayName();
或者也许更好的方法是不在构造函数中定义函数并将其定义为类方法:
sayName() {
return this.name;
}
推荐阅读
- java - 我应该使用 try/catch 吗?
- c# - 如何在使用 MS Access 和 OleDb 连接的 Insert Into 命令期间返回主键值?
- python - windows系统托盘图标作为服务
- java - 无法使用 selenium Java 选择下拉值
- excel - 过滤后如何在表格中获取可见单元格的值 - 仅适用于第一个值
- mysql - Maria 数据库中的行锁定
- javascript - 根据所选选项更改字体大小
- typescript - 如何在 TypeScript 中覆盖量角器的 jasmine.Spec.prototype.addExpectationResult?
- java - Maven nested dependency is not accessible
- json - 在 JSON - REST API 上,如何对非关键错误或重新尝试执行警告