Javascript 在类中声明正则函数和arrow函数之前调用它们
如果我编写一个像这样的React类: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
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的基本原理有了更多的了解。非常感谢你!