{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 ..
你能找出我的代码有什么问题吗?
{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 ..
你能找出我的代码有什么问题吗?
首先,您不能真正覆盖$first
. 文档状态定义的局部变量let
是不可修改的。这是因为每当您使用 为值设置别名时let
,都会在编译的输出中创建一个新变量。此外,soy 表达式的作用域规则与 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
是 value 的别名10
。引入了一个变量来保存这个值。
在(2)中:
右手: $first
从 (1) 中获取值,因为它是在父块中定义的。
左手: $first¹
被别名为$first
- 1 = 10 - 1 = 9 的值。由于$first
不能覆盖的定义,引入了一个新的变量,不同于(1)。有两点需要注意:
一种。的值为$first¹
9,但在此代码段中从未读取过它。
湾。$first¹
仅“存在”在它定义的块内,即在{if...}
. 事实上,如果你要插入{$first}
(3),它会输出 9。
在 (4) 中, 的值$first¹
超出了块引入的范围{if}
,无法再读取,因此$first
(1) 中的值是唯一可见的,产生 10。它使用与 (1) 相同的变量在编译的输出中。