Javascript onPress方法中箭头函数与正常函数的行为

Javascript onPress方法中箭头函数与正常函数的行为,javascript,react-native,ecmascript-6,Javascript,React Native,Ecmascript 6,我正在学习native react并学习更多关于javascript的知识,所以我仍然不了解它的很多行为。我使用TouchableOpacity及其道具onPress创建了一个按钮组件。 为了让它工作,我必须发送我想作为道具执行的函数,但在这里,由于经验不足,我已经失败了 我正在发送一个console.log,当我按下该按钮时,它将被激活。因此,我直接在我定义的props中传递了console.log,但是当我单击按钮时它不起作用,但是,它是在代码初始化时执行的。另一方面,当我传递了一个包含co

我正在学习native react并学习更多关于javascript的知识,所以我仍然不了解它的很多行为。我使用TouchableOpacity及其道具onPress创建了一个按钮组件。 为了让它工作,我必须发送我想作为道具执行的函数,但在这里,由于经验不足,我已经失败了

我正在发送一个console.log,当我按下该按钮时,它将被激活。因此,我直接在我定义的props中传递了console.log,但是当我单击按钮时它不起作用,但是,它是在代码初始化时执行的。另一方面,当我传递了一个包含console.log的arrow函数时,它是在单击按钮时执行的

为了更清楚,我将显示我的代码:

这是我的按钮组件:

const Button = ({ onUserPress, children, color }) => {

    const state = {

    };
    return (
        <TouchableOpacity onPress={ onUserPress } style={styles.buttonStyle} >
            <Text style={styles.textStyle}>
                {children}
            </Text>
        </TouchableOpacity>
    );
};
我这样称呼他们:

<Button onUserPress={ console.log("hello") }>Something</Button>
<Button onUserPress={ ()=>{console.log("hello")} }>Something</Button>
这是在初始化我的应用程序时执行的,按下按钮时不会发生任何事情

另一方面,当我使用相同的组件,但我传递console.log-in-arrow函数时,如下所示:

<Button onUserPress={ console.log("hello") }>Something</Button>
<Button onUserPress={ ()=>{console.log("hello")} }>Something</Button>
这将仅在我按下按钮组件时执行控制台日志


有人能给我解释一下为什么行为不同吗?函数式编程的世界对我来说是全新的,这些东西对我来说似乎很奇怪。据我所知,两者都是函数,所以从我无知的角度来看,它们对我来说没有明显的区别。使行为不同的区别是什么?

您不是在比较普通函数和箭头函数

{和}之间的内容是一个表达式,将对其求值,并将结果指定给prop

因此,您调用console.loghello,获取返回值并将其作为函数分配给onUserPress,这没有任何意义,因为console.log的返回值不是函数

非功能:


console.loghello 您没有将普通函数与箭头函数进行比较

{和}之间的内容是一个表达式,将对其求值,并将结果指定给prop

因此,您调用console.loghello,获取返回值并将其作为函数分配给onUserPress,这没有任何意义,因为console.log的返回值不是函数

非功能:


console.loghello 如果不想使用arrow函数,则需要传递一个常规函数:onUserPress={function{console.loghello}

此外,还可以传递onUserPress={console.log},在本例中,console.log将接收一个事件对象作为参数


函数{console.loghello和=>console.loghello的区别在于,在第二种情况下,这将指向您的组件

如果您不想使用arrow函数,则需要传递一个常规函数:onUserPress={function{console.loghello}

此外,还可以传递onUserPress={console.log},在本例中,console.log将接收一个事件对象作为参数


函数{console.loghello和=>console.loghello的区别在于,在第二种情况下,这将指向您的组件

console.loghello是其中的一个函数调用..=>{console.loghello}是一个函数定义。第一个看起来像是一个输入错误。我不认为这是故意的。console.loghello是其中的一个函数调用..=>{console.loghello}函数定义第一个看起来像是输入错误。我不认为这是故意的。感谢你的解释,这解决了我的一部分疑问,但我仍然不明白为什么当我直接传递consol.log时,它会在启动时执行,而当我在箭头函数中传递它时,它只在我触发事件时执行?@kmilo93sd-如果您编写了一个console.log函数,那么它会立即记录它。如果您编写了一个console.log函数,那么在调用该函数时它会记录一些东西。但是为什么箭头函数会在之后执行,而不是在我直接传递它时执行?因为该函数在那一刻没有执行?我理解这个控制台。log也是一个函数,它不返回值,我理解,但arrow函数的形式也是一个函数,是什么使它在启动应用程序之后而不是启动应用程序时运行?是什么导致了这种行为?如果我直接执行我自己的函数,如果我返回值,它也会在启动时执行,控制台.log只是一个例子。对不起,我的英语不好。但是为什么箭头函数是在事后执行的,而不是在我直接传递它时执行的?-因为它在事件触发之前不会被调用。我知道console.log是一个函数-console.log是,console.logHello不是。感谢您的解释,这解决了我的部分问题ubt,但我仍然不明白为什么当我直接传递consol.log时,它会在启动时执行,而当我在箭头函数中传递它时,它只会在我触发事件时执行?@kmilo93sd-如果你是console.log的话
然后马上记录下来。如果您编写了一个console.logs的函数,那么在调用该函数时它会记录一些东西。但是为什么箭头函数会在之后执行,而不是在我直接传递它的时候执行呢?因为那个函数在那个时刻没有执行?我理解console.log也是一个函数,它不返回值,我理解,但是箭头函数的形式也是一个函数,是什么使它在启动应用程序之后而不是启动应用程序时运行?是什么导致了这种行为?如果我直接执行自己的函数,如果我返回一个值,它也会在启动时执行,console.log就是一个例子。对不起,我的英语不好。但是为什么箭头功能是在事后执行的,而不是在我直接传递它的时候执行的呢因为直到事件触发才调用它。我知道console.log是一个函数-console.log是,console.logHello不是。