3
为什么在没有initvalue的情况下defvar作用域的工作方式有所不同?
假设我有一个名为elisp-defvar-test.el包含的文件: ;;; elisp-defvar-test.el --- -*- lexical-binding: t -*- (defvar my-dynamic-var) (defun f1 (x) "Should return X." (let ((my-dynamic-var x)) (f2))) (defun f2 () "Returns the current value of `my-dynamic-var'." my-dynamic-var) (provide 'elisp-dynamic-test) ;;; elisp-defvar-test.el ends here 我加载此文件,然后进入暂存缓冲区并运行: (setq lexical-binding t) (f1 5) (let ((my-dynamic-var 5)) (f2)) (f1 5)按预期返回5,表示的主体按预期f1被my-dynamic-var视为动态范围变量。但是,最后一种形式给出的变量变量为void my-dynamic-var,表明该变量使用词法作用域。似乎与的文档不一致,该文档defvar说: 该defvar表格还声明变量为“特殊”,所以它始终是动态即使势必lexical-binding为t。 …