在模板文字中定义函数

Posted

技术标签:

【中文标题】在模板文字中定义函数【英文标题】:Defining a function inside a template literal 【发布时间】:2017-06-17 12:15:48 【问题描述】:

我使用styled-components 作为 React 样式的解决方案。他们有一个很好的方法,使用模板文字来插入 CSS。模板文字被传递给组件的 props,以便您可以执行以下操作:

const PasswordsMatchMessage = styled.div`
    background: $props => props.isMatching ? 'green' : 'red';
`

结果是一个组件,它根据isMatching 的值呈现带有绿色或红色背景的div 标签。以上将通过 JSX 像这样使用:

<PasswordsMatchMessage isMatching=doPasswordsMatch>...</PasswordsMatchMessage>

每次props 的值改变时,这个字符串都会被重新插值。这终于让我想到了我的问题:

每次插入模板文字时,模板文字中定义的箭头函数是否会重新定义?

如果是这样,那么我可能会考虑在模板字面量之外创建函数并将其传入,例如

const PasswordsMatchMessage = styled.div`
    background: $isMatchingFn;
`

【问题讨论】:

我不明白为什么那行不通。你测试过吗? @KeithA 它确实有效,这不是我的问题。我刚刚编辑了我的帖子以使问题更清楚,因为它有点被埋没了;) 嗯。我不知道。你的问题有原因吗? 这将是一个潜在的性能瓶颈 【参考方案1】:

是的,每次插入模板文字时,它都会定义一个新版本的函数。您可以通过定义自己的标签来跟踪先前的值来验证这一点。

var previous;
function trackInterpolations(literalParts, interpolated) 
  if (interpolated === previous) 
    answer = 'Got the same function';
   else 
    answer = 'Got a different function';
  
  previous = interpolated;
  return answer;

然后运行

trackInterpolations`background: $props => props.isMatching ? 'green' : 'red';`

几次,请注意它总是评估为'Got a different function',表明它每次都在创建一个新函数。

与此版本比较:

trackInterpolations`background: $isMatchingFn;`

第一次运行时,它会评估为'Got a different function'(因为它还没有看到isMatchingFn),但如果你再评估它几次,它总是会得到'Got the same function',因为函数引用正在被重用。

尽管在这种情况下,我不会太担心性能影响,除非您确实注意到速度变慢,否则请选择更具可读性的内容。与重新渲染 div 相比,创建新函数的开销可能不会很高。

【讨论】:

我想你的意思是说即使第二次运行它仍然会导致Got a different function - 否则,这意味着该函数没有被重新定义,因此与你的答案相矛盾。我也试过了,确实,它说每次都是不同的功能:)。关于性能瓶颈,不,我现在不会担心。但是这种模板文字的用法对我来说是新的,所以我想确保我理解发生了什么。 @maxedison 再读一遍,那部分不是很清楚,因为它在谈论两种不同的表达方式。是的,在某些情况下,可能会影响性能,所以很高兴知道:)

以上是关于在模板文字中定义函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 js 字符串模板文字中调用带参数的函数? [关闭]

AE里Element 3d模板中的文字怎么修改?

使用带有 JavaScript 模板文字函数的 for 循环

使用字符串文字作为 Django 模板中模板标签的参数

标记的模板文字如何在JavaScript中工作?

你可以在javascript中使用模板文字创建对象属性名称吗?