使用 ES6 箭头函数解决“TypeError: 无法读取未定义的属性‘<你的属性名称>’”

发布日期:2026-07-02 12:04:04   来源 : 杭州电子商务研究院    浏览量 :7
杭州电子商务研究院 发布日期:2026-07-02 12:04:04  
7

介绍

如果你是 React 开发人员或刚刚学习使用 JavaScript 编程,那么在尝试从 this关键字读取属性时,你可能会遇到这个可怕的错误:

      TypeError: Cannot read property '<your property name>' of undefined
    

如果你在编写 React 时遇到此错误,则很有可能是你试图在另一个函数中使用一个函数,并试图在嵌套函数中访问this关键字。但为什么会发生这种情况?

本指南将深入介绍 JavaScript 中的函数作用域。您将了解此错误发生的原因以及如何修复它。

让我们开始吧。

问题和初步解决方案

假设你刚刚编写了一个如下所示的小型 React 组件:

      class FishSpecies Extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            clickCount: 0
        };
    }

    onFishClicked() {
        this.setState(function(prevState, props) {
            return { clickCount:  prevState.clickCount + 1 };
        });
    }

    render() {
        return (
            <ul>
                {{ this.props.fish.map(function(fish) {
                    return <Fish name={fish.name} onClick={this.onFishClicked} />
                })}}
            </ul>
        )
    }
}
    

首先,这个组件看起来非常简单。这个组件所做的就是通过 props 接收鱼对象列表,并为每个对象渲染一个Fish组件,将几个 props 传递给每条鱼。但是,如果你创建这个组件并添加到真正的 React 应用中,它将失败。你将看到如下错误:

      TypeError: Cannot read property 'onFishClicked' of undefined
    

哦不,可怕的 TypeError 出现了!那么,为什么会发生这种情况?此错误通知您this未定义。具体来说,onClick={this.onFishClicked}因这个原因而失败。此处代码无法访问this 的原因在于 JavaScript 中的作用域的工作方式。

从本质上讲,函数是 JavaScript 中的对象。在 JavaScript 中创建函数时,它会根据实例化的上下文获得自己的作用域。在这种情况下,实际上没有上下文,因此this实际上是未定义的!本质上,代码在 React 框架中以严格模式运行,因此不使用全局上下文,而完全不使用上下文。查看这些文档了解更多信息。

那么你该如何修复这个问题呢?其实,你有很多选择。在下一节中,我们将展示修复此错误的最佳和最现代的方法。

ES6 解决方案

所以你已经诊断出了问题。你需要确保你的函数可以访问类组件的this上下文!为此,你可以使用 ES6 箭头函数。

除了使代码更简洁易读之外,箭头函数还有另一个用途。虽然不是很明显,但箭头函数在上下文如何传递给函数方面发挥了重要作用。本质上,当您使用箭头语法声明一个函数时,您就是在告诉 JavaScript 代码将this的当前上下文绑定到正在创建的新函数中。这不是很明显,因为与使用.bind方法绑定this 的显式方式相比,这种绑定是隐式完成的

让我们看看如何使用箭头函数来修复你的代码!

      class FishSpecies Extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            clickCount: 0
        }
    }

    onFishClicked() {
        this.setState((prevState, props) => {
            return { clickCount:  prevState.clickCount + 1 };
        });
    }

    render() {
        return (
            <ul>
                {{ this.props.fish.map(fish => {
                    return <Fish name={fish.name} onClick={this.onFishClicked} />
                })}}
            </ul>
        )
    }
}
    

瞧!这只是对上述两个函数声明的简单更改,但现在您可怕的 TypeError 已消失,因为您渲染函数中传递给Array.map的函数可以访问组件的this上下文。而这一切都只需通过更改您声明函数的方式即可实现。

结论

箭头函数是一种将this的当前上下文绑定到嵌套函数的强大方法。不幸的是,这个主要好处是隐式的,所以你永远不会通过查看它的用法来了解它。React 组件中的大多数(如果不是全部)函数声明都应声明为箭头函数。这样做将有助于您避免在this的上下文及其绑定到的内容方面产生混淆。

有关this关键字与函数作用域关系的更多信息,请查看Mozilla JavaScript 开发者文档

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据