{let $first: 10 /} // this is a single line soy comment
{if $first > 5 }
{$first}<br/>
{let $first:$first-1 /}
{/if}
{$first}
我尝试了这个,打印出来:10 10
理想情况下,它应该打印:10 9 ..
请问您的代码中有什么错误吗?
答案 0 :(得分:3)
首先,您无法真正覆盖$first
的值。由let
定义的documentation个状态局部变量不可修改。这是因为无论何时使用let
对值进行别名,都会在已编译的输出中创建一个新变量。此外,大豆表达式的范围规则与Javascript中的不同(但您可以认为{let}
具有与ECMAScript 6的let
语句类似的语义,即非提升,块范围)。
在您的代码中:
{let $first: 10 /} /* 1 */
{if $first > 5}
{$first}<br/>
{let $first¹: $first-1 /} /* 2 */
/* 3 */
{/if}
{$first} /* 4 */
发生的事情是:
在(1)中,$first
是值10
的别名。引入变量来保存此值。
在(2)中:
右手: $first
从(1)获取其值,因为它是在父块中定义的。
左手: $first¹
被归结为$first
- 1 = 10 - 1 = 9产生的值。因为$first
的定义可以不被覆盖,引入了一个新的变量,与(1)不同。有两点需要注意:
一个。 $first¹
的值为9,但在此代码段中永远不会读取。
湾$first¹
仅在其定义的块内“生活”,即在{if...}
内。事实上,如果您要在(3)中插入{$first}
,它将输出9。
在(4)中,$first¹
的值不在{if}
块引入的范围之内,因此$first
来自({1}} )是唯一一个可见的,产生10个。它在编译输出中使用与(1)相同的变量。