Javascript Can';无法理解上下文:未定义,但它应该';不可能

Javascript Can';无法理解上下文:未定义,但它应该';不可能,javascript,this,Javascript,This,我需要通过单击按钮从页面中删除一些弹出元素,但是上下文或对象的属性发生了一些事情,我完全不知道发生了什么 constructor(container) { this._container = container; this._card = null; this._popup = null; } render(card) { this._card = new Card(card); renderComponent(this._contain

我需要通过单击按钮从页面中删除一些弹出元素,但是上下文或对象的属性发生了一些事情,我完全不知道发生了什么

  constructor(container) {
    this._container = container;
    this._card = null;

    this._popup = null;

  }
  render(card) {
    this._card = new Card(card);

    renderComponent(this._container, this._card);

    this._card.clickCardListener(".film-card__title", "click", function () {
      this._popup = new Popup(card);

      console.log(this._popup);

**//log: Popup {_element: null, _card {...}**

      renderComponent(mainElement, this._popup);
      console.log(this._popup);

**//log: Popup {_element: section.film-details, _card {...}**

      this._popup
        .getElement()
        .querySelector(".film-details__close-btn")
        .addEventListener("click", function () {
          console.log(this._popup);

**//log: undefined**

        });
    });
}

在我尝试使用控制器之前,所有这些都起到了作用(我正在学习OOP,所以它是…),请帮忙。我已经花了大约5个小时在这行代码上,我不知道我在做什么

  this._popup
    .getElement()
    .querySelector(".film-details__close-btn")
    .addEventListener("click", () => {
      console.log(this._popup);

    });

试试这个

  this._popup
    .getElement()
    .querySelector(".film-details__close-btn")
    .addEventListener("click", () => {
      console.log(this._popup);

    });


您必须将arrow函数作为
.addEventListener
方法的第二个参数传递,因为它没有自己的上下文,并且接受父上下文

 this._popup
    .getElement()
    .querySelector(".film-details__close-btn")
    .addEventListener("click", () => {
      console.log(this._popup);
    });

您可以阅读有关函数的this关键字的更多信息。

您必须将arrow函数作为
.addEventListener
方法的第二个参数传递,因为它没有自己的上下文,并且接受父上下文

 this._popup
    .getElement()
    .querySelector(".film-details__close-btn")
    .addEventListener("click", () => {
      console.log(this._popup);
    });

您可以阅读有关函数的this关键字的更多信息。

它成功了,非常感谢。到底是怎么回事?我们“存储”了这个更高的范围?@Stan_Effy否,箭头函数从封闭范围中拾取了
这个
上下文,但是
函数定义了它们自己的
这个
。感谢解释请看:它起作用了,非常感谢。到底是怎么回事?我们“存储”了这个更高的作用域?@Stan_Effy否,箭头函数从封闭的作用域中拾取
this
上下文,但是
function
函数定义了它们自己的
this
。感谢您的解释请参见:
this
在用
function(){…}定义的回调中
与外部的
不同。“我已经在这行代码上花了大约5个小时,我不知道我在做什么”好的,所以这里有一个开始:如果不运行并希望它能工作,就永远不要写出一个完整的尝试解决方案(这里有~50个LoC!)。把一个任务分解成子任务,用最简单的方法完成第一个任务。我可以在屏幕上显示一些东西吗?伟大的我能做按钮吗?伟大的我是否可以在单击按钮时使第一件事情(例如消失并重新出现)消失?伟大的我能让第一件东西看起来像窗户吗?现在你基本上有了一个模式弹出窗口。@JaredSmith这是我在互联网上第一个被问到的问题,我对上下文几乎一无所知,这就是为什么我决定从亚当和夏娃开始。问题是,在我使用控制器执行此任务之前,main.js工作得非常好(并且obv.的组织方式有所不同),以使main.js中的代码不那么多。感谢您的建议和解释,很高兴这里有这样的人
this
在用
function(){…}
定义的回调中
this
与外部的
this
不同。“我在这行代码上已经花了大约5个小时,我不知道我在做什么”ok,所以这里有一个开始:在没有运行它并希望它工作的情况下,永远不要完整地写出一个尝试过的解决方案(这里有~50个LoC!)。把一个任务分解成子任务,用最简单的方法完成第一个任务。我可以在屏幕上显示一些东西吗?伟大的我能做按钮吗?伟大的我是否可以在单击按钮时使第一件事情(例如消失并重新出现)消失?伟大的我能让第一件东西看起来像窗户吗?现在你基本上有了一个模式弹出窗口。@JaredSmith这是我在互联网上第一个被问到的问题,我对上下文几乎一无所知,这就是为什么我决定从亚当和夏娃开始。问题是,在我使用控制器执行此任务之前,main.js工作得非常好(并且obv.的组织方式有所不同),以使main.js中的代码不那么多。谢谢你的建议和解释,有这样的人在这里真好啊,当然!我是个白痴,谢谢你啊,当然!我是个白痴,谢谢你