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
相关产品推荐
相关产品推荐

