只要在 setq 之前 defvar
就行。当然,实际上 defvar
只要在 closure variable capture 之前出现就没有问题,不能动态绑定本质上是代码不规范没有在使用动态作用域变量之前 require
其对应的 defvar
所在的文件或另外声明 defvar
导致的。
额外附一条说明,在变量本身 unbound 的情況下,用不带 initvalue 的 defvar
不会给变量赋值,见 为啥一个无关的局部绑定会引起编译警告?
如果没有对应的 setter,在动态绑定行为上 setopt
的行为和 setq
和 setq-default
都是一样的,并不会自动让变量变 special,所以你的说法是不准确的。
需要包加载完以后改 custotm 变量,或包的加载状态不固定如 pdumper 和 lazy 都在用的情况还是有的。