Javascript 为什么';这';在构造函数内的函数中未定义?
我正在尝试在Node.js中实现我自己版本的Promissions,以供练习。我得到了我不明白的结果。我创建了以下代码来说明我的问题是关于什么的Javascript 为什么';这';在构造函数内的函数中未定义?,javascript,class,constructor,this,Javascript,Class,Constructor,This,我正在尝试在Node.js中实现我自己版本的Promissions,以供练习。我得到了我不明白的结果。我创建了以下代码来说明我的问题是关于什么的 class Person { constructor(name) { this.name = name // console.log(this) function sayName() { console.log(this.name) } sayName() } } const joe
class Person {
constructor(name) {
this.name = name
// console.log(this)
function sayName() {
console.log(this.name)
}
sayName()
}
}
const joe = new Person('Joe')
我收到错误消息“TypeError:无法读取未定义的属性“name”。当我调用构造函数时,“this”的值是新创建的对象,因此如果我取消注释注释注释行,我将在该行注销正在创建的对象
当我调用sayName函数时,我希望'this'的值是全局对象。在我见过的大多数情况下,可以安全地假设,当您开始定义一个新函数时,“this”的值就是全局对象。但是这里它是“未定义的”,因此我得到了错误消息
如果我在不使用class关键字的情况下执行相同的操作,并将sayName函数放入构造函数,它的行为与预期的一样,并记录“undefined”,因为在全局对象上没有定义name属性
function Person(name) {
this.name = name
function sayName() {
console.log(this.name)
}
sayName()
}
const joe = new Person('Joe')
我知道在使用class关键字时会触发一些安全机制。我最好的猜测是,两个例子之间的差异,其中一个在我不知道的情况下被触发
请告诉我差异的原因,为什么在第一个示例中未定义“this”的值!谢谢当在构造函数中定义时,它看起来像函数声明
function(){}
losethis
上下文。我想这与构造函数如何在幕后实现有关。您可以使用
sayName = sayName.bind(this);
sayName();
或者更好的方法是不在构造函数中定义函数,而是将其定义为类方法:
sayName() {
return this.name;
}
默认情况下,类使用使用strict
。所以这被设置为undefinedSee:谢谢你的回答,尽管这个问题在上面的评论中得到了很好的回答('类默认使用use strict。所以这被设置为undefined',等等)