在模板中定义的变量有三种类型:

plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。

局部变量:在宏定义体中有效,使用local指令创建和替换。

循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量

局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子:

<#assign x = "plain"> 
1.${x}  


<@test/> 
    
6. ${x}  

<#list ["loop"] as x> 
7. ${x} 
<#assign x = "plain2"> 
8. ${x}  
</#list> 
  
9. ${x}  
  
<#macro test> 
    2. ${x}  
    <#local x = "local"> 
    3. ${x}  
    <#list ["loop"] as x> 
    4. ${x}  
    </#list> 
    5. ${x}  
</#macro> 

输出结果:

1. plain 
2. plain 
3. local 
4. loop 
5. local 
6. plain 
7. loop 
8. loop 
9. plain2 

内部循环变量隐藏同名的外部循环变量,如:

<#list ["loop 1"] as x> 
    ${x} 
    <#list ["loop 2"] as x> 
      ${x} 
      <#list ["loop 3"] as x> 
        ${x} 
      </#list> 
      ${x} 
    </#list> 
    ${x} 
</#list> 

输出结果:

loop 1 
    loop 2 
      loop 3 
    loop 2 
  loop 1 

模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是Big Joe:

<#assign user = "Joe Hider"> 

${user}          <#-- prints: Joe Hider --> 
${.globals.user} <#-- prints: Big Joe -->