名字解析
名字解析决定表达式中的标识符指向哪个声明。
属性、回调和函数共享相同的规则。
标识符也可以通过 := 赋予元素的 id 来命名一个元素。
某些元素可以通过预定义名字访问:
self指当前元素——即名字所在的绑定、回调或函数所属的元素。parent指包围当前元素的元素。 仅当当前元素在同一组件内有一个包围元素时,它才可用。root指当前组件的最外层元素。
root 是每个组件最外层元素的自动 id;显式命名为 root 的元素会构成保留 id 错误。
self、parent 和 root 是元素引用,用于限定成员,例如 self.width 或 root.some-property。
true 和 false 是两个布尔值的预定义名字,无法重新定义。
当标识符不带限定符使用时,按以下顺序尝试并取第一个匹配项来解析:
- 在包围块中用
let声明的局部变量,或包围回调或函数处理程序的参数。 self、parent、true或false。- 元素 id。
id 在当前组件的元素树中搜索;当前元素的 id 以及从
root可达的任何元素的 id 都可见,包围for元素的 id 以及嵌套在其中的任何元素的 id 也都可见。root在这里作为最外层元素的 id 解析。 - 作用域中已声明的属性、回调或函数。
首先尝试当前元素(
self),然后是其包围元素,依此类推直到组件根。 以这种方式只能找到由源中声明引入的成员;元素或祖先的内置属性不能以非限定方式访问,必须写作self.name或通过 id 访问。 在for元素内,循环的索引和模型数据名字在这里解析。 - 按名字查找全局对象单例或枚举。
- 内置命名空间:
Colors、Easing、Math、Key、FontWeight或MouseCursor。 - 期望类型的具名值:期望
color或brush处的具名颜色,期望easing处的具名缓动曲线,或期望该枚举处的枚举值。 因此,只有在其类型已知为该枚举的位置,才能书写不带类型的枚举值。 - 内置自由函数,例如数学和颜色函数以及
debug。
产生匹配的第一个步骤生效,因此较早的种类会遮蔽后面同名的种类。 局部变量遮蔽作用域中的成员,当前元素上的成员遮蔽祖先上的成员,id 优先于作用域中同名的属性。
当标识符用元素限定——id、self、parent 或 root——时,成员必须定义在该元素上或从其基类型继承。
在这种情况下,解析不会回退到祖先元素。
因此,不带限定符调用成员与用 self 调用它不等价:非限定形式搜索整个作用域,而 self.name 只查看当前元素。
通过限定符到达的成员受可见性约束:另一个组件的 private 属性、回调或函数无法访问,特殊的仅绑定属性无法读取。
全局对象的成员通过其名字访问,例如 Name.property、Name.callback(...) 或 Name.function(...)。
跨元素的遮蔽
Section titled “跨元素的遮蔽”由于已声明成员从当前元素开始向外查找,声明在内层元素上的成员会遮蔽声明在外层元素上的同名成员。 只要声明在不同的元素上,同一组件中允许存在多个同名函数;在其子树内进行的非限定调用中,内层函数会遮蔽外层函数:
export component Example { property <int> secret_number: my-function(); public pure function my-function() -> int { return 1; }
VerticalLayout { public pure function my-function() -> int { return 2; }
Text { text: "The secret number is " + my-function(); public pure function my-function() -> int { return 3; } }
Text { text: "The other secret number is " + my-function(); } }}这里 secret_number 设为 1,第一个标签显示 “The secret number is 3”,第二个显示 “The other secret number is 2”。
© 2026 SixtyFPS GmbH