# 12.3 局部变量

全局变量会持续影响整个 Lisp 程序，直到这个全局变量被修改。有时候局部变量可能更加有用。局部变量是仅仅在 Lisp 程序的某一阶段起作用的变量。当一个变量拥有一个局部的值，我们称这个变量 局部绑定 到了这个值上，而这个变量就称为局部变量。

举个例子，当一个函数被调用时，其形式参数变量便会收到一个局部的值，这个值正是之前用来调用该函数的实际参数的值。这种局部绑定仅仅在函数的内部发挥作用。再举一个例子，特殊表达式 let 显式的建立一个局部绑定，而这个局部绑定仅仅在 let 表达式中发挥作用。

当我们提到全局绑定时，我们同时再说这个值被全局性的保留了。

建立局部的绑定，会先将之前的变量值保存下来。我们称之前的变量值被隐藏了(shadowed)。在局部变量的作用域内，使用 setq 仅仅是局部绑定。当局部变量不在发挥作用后，之前被隐藏的变量便会回来。

同一个变量可以在同一时间拥有一个以上的局部绑定。（比如在嵌套的 let 表达式中）。当前的绑定则由实际生效的绑定决定。这决定了最终对变量符号求值的结果，而其中用于绑定的，实际上是 setq。

在大多数情况下，你可以认为当前的绑定时最近的一次局部绑定，或全局绑定（在没有其他局部绑定的情况下）。但是更精细的理解则取决于 “界定规则”。默认的 Emacs “界定” 方法是动态作用域规则，也就是说，当前的绑定是 Lisp 程序运行时(runtime)最近的一次绑定。具体细节请参考 动态绑定章。此外，另外一种可选的 "界定规则" 是语法绑定。

下面的两个 特殊式 let 和 let\* 用于创建局部绑定。

TODO

变量还可以进行 缓冲区局部绑定。少数变量还可以进行 终端局部绑定。这些局部绑定和常规的局部绑定非常相似，只不过他们绑定的值取决于具体你处在 Emacs 中的什么位置。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://emacs-lisp.ivory.cafe/bian-liang/ju-bu-bian-liang.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
