在 Array.map 回调中无法理解此上下文

Having trouble understanding this context in Array.map callback

提问人:1sentenced 提问时间:10/18/2022 最后编辑:1sentenced 更新时间:10/18/2022 访问量:105

问:

我在 React 组件中有以下代码片段。这是一个微不足道的例子,但我正在努力更好地理解关键字及其上下文this

const NAVBAR_ITEM_TITLES = ["Home", "About", "Contact"];

function makeNavbarItems() {
  return NAVBAR_ITEM_TITLES.map(item => ({
    title: item,
    handleButtonClick() {
      console.log(`clicked the ${this.title} button`);
    },
  }));
}

const Navbar = () => {
  const navbarItems = makeNavbarItems();

  return (
    <>
      {navbarItems.map(item => (
        <div>
          <button key={item.title} onClick={item.handleButtonClick}>
            {item.title}
          </button>
        </div>
      ))}
    </>
  );
};

我写了一个小函数,它返回一些匿名对象来填充导航栏。但是,返回的匿名对象中的上下文是未定义的。我知道如果我创建一个命名对象,那么我可以访问 title 属性,例如 ,但我想了解我做错了什么以及如何解决它。thismapmyObjmyObj.title

干杯。

javascript reactjs 这个

评论

1赞 Nick Vu 10/18/2022
从您的代码来看,它工作正常。 值仅在您尝试使用箭头函数时出现。如果您可以分享您的通话方式,那将很有帮助undefined() => {}handleButtonClick
0赞 1sentenced 10/18/2022
@NickVu当然,只是更新了完整组件。
0赞 Guillaume Brunerie 10/18/2022
React 中函数组件的一大优点是,你永远不需要使用它的复杂行为。this

答:

3赞 Terry 10/18/2022 #1

您已经可以访问该字符串,并将其别名化为: 根本没有必要使用:itemtitlethis

function makeNavbarItems() {
  return NAVBAR_ITEM_TITLES.map(item => ({
    title: item,
    handleButtonClick() {
      console.log(`clicked the ${item} button`);
    },
  }));
}
0赞 Jimbot 10/18/2022 #2

this始终引用当前上下文中的对象,在本例中,引用使用原型创建的新对象。正如@Terry所说,这里没有必要。在某些情况下,您需要区分两个名称相同但作用域不同的表达式。(例如,一个全局变量和一个同名的局部变量)。this