动态模块作用域
DynamicModule 旨在成为一个词法作用域构造,也就是说 DynamicModule 变量将只限定那些在 DynamicModule 主体中按字面出现的变量的任何实例. 这与 Module 的工作方式类似. 例如,在输入中:
符号 x 由 DynamicModule 限定作用域,并且它在主体中的实例被本地化并保持一个值,该值在生成的用户界面构造中被跟踪. 符号 y 是无作用域的,它指的是内核对 y 的当前值,可以随时设置,与用户界面结构无关.
违反词法作用域的 DynamicModule 用法示例:
在上面的例子中,Dynamic[x1] 中 x 的词法作用域严格地由 DynamicModule 限定,但 f1[] 定义中的 x1 不是. 尽管如此,由 f1[] 生成的滑块显然改变了 DynamicModule 变量 x1 的值,而不是 x1 的全局内核实例.
解决 DynamicModule 变量的作用域问题涉及重写代码,使变量的所有实例都出现在DynamicModule 变量的主体中. 在前面的示例中,可以通过将 Dynamic[x] 作为参数传递给 f[] 来修复问题.
如果需要直接访问变量而不是完整的 Dynamic 表达式,最好定义您的函数,使其接受一个封装在 Dynamic 中的变量. 在以下示例中,f3 定义了一个反转输入的滑块. f3 的函数模式中包含了 Dynamic 以便变量可以被隔离,并在定义中使用.
将设置更改为 True 并重新运算生成用户界面结构的代码,这允许您测试代码是否使用了不正确的作用域. 重新运行原始示例演示了一个不再与值连接的滑块.