0
{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 ..

你能找出我的代码有什么问题吗?

4

1 回答 1

3

首先,您不能真正覆盖$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) 相同的变量在编译的输出中。

于 2014-05-19T09:24:50.120 回答