Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';这';在构造函数内的函数中未定义?_Javascript_Class_Constructor_This - Fatal编程技术网

Javascript 为什么';这';在构造函数内的函数中未定义?

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

我正在尝试在Node.js中实现我自己版本的Promissions,以供练习。我得到了我不明白的结果。我创建了以下代码来说明我的问题是关于什么的

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(){}
lose
this
上下文。我想这与
构造函数如何在幕后实现有关。您可以使用

sayName = sayName.bind(this);
sayName();
或者更好的方法是不在构造函数中定义函数,而是将其定义为类方法:

sayName() {
  return this.name;
}

默认情况下,类使用
使用strict
。所以这被设置为undefinedSee:谢谢你的回答,尽管这个问题在上面的评论中得到了很好的回答('类默认使用use strict。所以这被设置为undefined',等等)