求值与纯度
绑定是惰性求值的:其表达式在查询属性值时才运行,而不是在设置绑定时运行。
在求值绑定的表达式时,它读取的每个属性都会注册为该绑定的依赖项。 当其中任何属性发生变化时,该绑定会被标记为脏。 下次查询该属性时会重新求值表达式,并根据该次求值期间读取的属性重建其依赖集合。 表达式不读取任何属性的绑定永远不会被标记为脏,并且至多求值一次。
依赖集合在每次求值时都会重建,因此它始终反映最近一次运行时读取的属性。 在后续求值不会走的分支上读取的属性不是该次求值的依赖项。
被覆盖的绑定
Section titled “被覆盖的绑定”一个属性至多持有一个绑定。 在属性上设置新绑定会替换任何先前的绑定;最后一个绑定生效。
仅当属性通过绑定表达式(x: other.value)或双向绑定(<=>)赋值时,绑定才处于活动状态。
命令式赋值(foo.bar = 42;)会移除绑定:
从那一刻起,属性不再对它曾绑定到的值作出反应。
该属性仍可通过后续赋值更新,但会失去其自动响应性。
被双向绑定拦截的赋值是例外:它通过链接写入,并保留该绑定。
这也适用于大多数内置的 in-out 属性,例如 TextInput 的 text 属性:
用户交互会像命令式赋值一样写入该属性,并移除对它的现有绑定。
在这种情况下,为保持响应性,请使用双向绑定, 或使用变更回调跟踪更新。
求值属性绑定不得改变除该属性本身以外的任何可观察状态。 具有这种性质的表达式是纯的;否则它就有副作用。 由于绑定是惰性求值的,副作用的顺序以及它们是否会发生都是未定义的,因此绑定必须是纯的。
编译器强制要求纯上下文中的代码没有副作用。 纯上下文包括:
- 属性绑定表达式。
for元素的模型表达式。- 声明为
pure的函数或回调的主体。
在纯上下文中,以下内容会构成编译错误:
- 对属性的赋值或自赋值(
=、+=、-=、*=、/=)。 - 调用不是
pure的回调。 - 调用不是纯的函数。
- 调用有副作用的内置函数。
pure 关键字用于标注回调和函数,
以便它们可以从纯上下文中调用。
pure 回调的处理程序和 pure 函数的主体本身就是纯上下文,并会据此检查。
export component Example { pure callback foo() -> int; public pure function bar(x: int) -> int { return x + foo(); }}私有函数的纯性会被推断:当且仅当其主体不包含副作用时,编译器才将其视为纯的。
私有函数仍可声明为 pure,以便让编译器拒绝有副作用的主体。
实现接口中 pure 函数的函数本身必须是纯的;将其声明为非纯会构成编译错误。
反之则允许:纯的实现可以满足非纯的声明。
© 2026 SixtyFPS GmbH