You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Freemarker递归函数修改调用方变量值问题咨询

FreeMarker递归函数变量被修改问题:分析与解决

这是正常行为吗?

是的,这是FreeMarker函数默认的变量作用域特性导致的。FreeMarker里<#assign>默认创建的是函数级共享变量,而非严格隔离的局部变量——递归调用的函数实例会共用同一个变量空间,后续递归对temp的赋值会直接覆盖之前的变量值。

你写的代码里,第一次调用getTempVar('init')时temp被设为'init';紧接着递归调用getTempVar('temp'),此时在同一个作用域里把temp重新赋值为'temp';回到外层调用时,temp已经被修改,所以最终返回的是'temp'而非预期的'init'。

如何避免递归时修改调用方变量?

要创建真正独立的局部变量,给<#assign>加上local修饰符即可,这样每个函数调用实例都会拥有专属的变量副本,递归调用时不会互相干扰。修改后的代码如下:

${getTempVar('init')}

<#function getTempVar var >
    <#assign temp = var local>
    <#if var == 'init' && getTempVar('temp') == 'temp'>
    </#if>
    <#return temp>
</#function>

如果使用FreeMarker 2.3.30及以上版本,也可以直接用<#local temp = var>替代<#assign temp = var local>,写法更简洁,效果完全一致。

内容的提问来源于stack exchange,提问作者Rahul verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:03:16