javascript - 'this' 在类方法中未定义
问题描述
这有效:
class C {
constructor(p1, p2) {
this.p1 = 0;
this.p2 = [];
this.setP1(p1);
p2.forEach(p => this.addP2(p));
}
setP1(p) { this.p1 = p }
addP2(p) { this.p2.push(p) }
}
let c = new C(10,[20]);
console.log(c);
C { p1: 10, p2: [ 20 ] }
但这不会:
class C {
constructor(p1, p2) {
this.p1 = 0;
this.p2 = [];
this.setP1(p1);
p2.forEach(this.addP2); // <- changed here
}
setP1(p) { this.p1 = p }
addP2(p) { this.p2.push(p) }
}
let c = new C(10,[20]);
console.log(c);
addP2(p) { this.p2.push(p) } ^ TypeError: Cannot read property 'p2' of undefined
还有两件事我不明白:
为什么它有效?在这两种情况下,
setP1
都没有明确绑定到this
,那么它如何p1
在第一种情况下成功更新属性?它不应该在 wherethis
isundefined
和 throw a的上下文中执行Cannot read property 'p1' of undefined
吗?为什么它不起作用?
p2.forEach(p => this.addP2(p));
显然等价于p2.forEach(this.addP2);
因为addP2
只接受一个参数。发生了什么使第一次工作,但第二次崩溃?
解决方案
推荐阅读
- tcl - 在取消设置跟踪变量时触发错误
- html - 百里香叶的 Jquery 选择器
- php - 我的 Laravel 邮件队列被处理但不发送电子邮件
- machine-learning - 计算用户发出指定声音的准确度百分比
- php - FOSRestBundle FormType 将 JsonArray 转换为 ArrayCollection
- mysql - 使用 golang 创建与 phpmyadmin 的连接时出错“命令不同步。您是否一次运行多个语句?”
- c# - 如何在c#中查找电报机器人发送的消息是否已正确发送到频道?
- python - 使用 jupyter notebook 时,Visual Studio Code 不断崩溃
- php - Laravel 控制器说未定义的请求,这里有什么错误吗?
- java - 由于 spring security 的 PasswordEncoder 返回 String 对象而不是字节数组,我应该创建自己的密码编码服务吗?