Javascript 在类中声明正则函数和arrow函数之前调用它们

Javascript 在类中声明正则函数和arrow函数之前调用它们,javascript,reactjs,function,arrow-functions,Javascript,Reactjs,Function,Arrow Functions,如果我编写一个像这样的React类: class SomeClass extends React.Component { state = { someState: this.someRegularFunction(), someOtherState: this.someArrowFunction() }; someRegularFunction() { return "someText"; } someA

如果我编写一个像这样的React类:

class SomeClass extends React.Component {
    state = {
        someState: this.someRegularFunction(),
        someOtherState: this.someArrowFunction()
    };

    someRegularFunction() {
        return "someText";
    }

    someArrowFunction = () => {
        return "someOtherText";
    };
}
Webstorm代码帮助警告调用arrow函数
this.someArrowFunction()
时说:

字段“someArrowFunction”在“state”之后声明,可能是 尚未分配

If不警告常规函数调用this.someRegularFunction()

如果Webstorm是正确的,则调用
this.someArrowFunction()
时执行失败,方法是:

TypeError:\u此.SomeArrow函数不是函数


我一直在寻找一些解释这种行为的文档,但找不到任何文档


为什么可以在类内声明之前调用常规函数而不是箭头函数?

因为该代码在功能上与以下代码相同:

class SomeClass extends React.Component {
    constructor(...args) {
        super(...args);
        this.state = {
            someState: this.someRegularFunction(),
            someOtherState: this.someArrowFunction()
        };
        this.someArrowFunction = () => {
            return "someOtherText";
        };
    }

    someRegularFunction() {
        return "someText";
    }
}
创建实例时,字段定义按源代码顺序处理。这就好像它们是在任何其他代码(在基类中)之前或在调用
super
(在子类中)之后插入构造函数的

相反,
someRegularFunction
是原型的一种方法,它是在评估类定义时创建的,而不是在创建实例时创建的

这在规范文本中包含在中。(不过,阅读规范文本并不适合胆小的人!:-)


旁注:它可以说是风格的问题,但是如果你正在执行那个箭头函数,以便它可以使用<代码> < <代码>,而不用担心它是如何被调用的(例如,作为事件处理程序),你可以考虑将它变成一个方法,然后在构造函数中(或者在构造函数中有效地使用<代码> BIN < /C>),而不是:

这对可能需要模拟函数的测试代码(通过在原型上替换函数)起到了更好的作用


但同样,这可能是一个风格问题。

因为该代码在功能上与此相同:

class SomeClass extends React.Component {
    constructor(...args) {
        super(...args);
        this.state = {
            someState: this.someRegularFunction(),
            someOtherState: this.someArrowFunction()
        };
        this.someArrowFunction = () => {
            return "someOtherText";
        };
    }

    someRegularFunction() {
        return "someText";
    }
}
创建实例时,字段定义按源代码顺序处理。这就好像它们是在任何其他代码(在基类中)之前或在调用
super
(在子类中)之后插入构造函数的

相反,
someRegularFunction
是原型的一种方法,它是在评估类定义时创建的,而不是在创建实例时创建的

这在规范文本中包含在中。(不过,阅读规范文本并不适合胆小的人!:-)


旁注:它可以说是风格的问题,但是如果你正在执行那个箭头函数,以便它可以使用<代码> < <代码>,而不用担心它是如何被调用的(例如,作为事件处理程序),你可以考虑将它变成一个方法,然后在构造函数中(或者在构造函数中有效地使用<代码> BIN < /C>),而不是:

这对可能需要模拟函数的测试代码(通过在原型上替换函数)起到了更好的作用


但同样,这可以说是风格的问题。

这正是我想要的,让我对JavaScript的基本原理有了更多的了解。非常感谢你!这正是我想要的,并让我对JavaScript的基本原理有了更多的了解。非常感谢你!