# 函数

URL: https://caijiao.org/lua/functions
Source: docs/lua/functions.md
Description: 学习 Lua 中函数的定义与调用方式，掌握参数传递、返回值、可变参数与匿名函数等概念。

函数（Function）是 Lua 中的 **一等公民（First-class value）**，  

可以赋值给变量、作为参数传递或作为返回值返回。  

这让 Lua 拥有极高的灵活性与函数式编程能力。


## 🧩 定义与调用函数

```lua
-- 定义函数
function greet(name)
  print("你好，" .. name .. "！")
end

-- 调用函数
greet("Lua")
````

> Lua 中函数定义使用关键字 `function`，以 `end` 结束。


## 🧮 返回值

函数可以返回一个或多个值。

```lua
function add(a, b)
  return a + b
end

function divmod(a, b)
  return math.floor(a / b), a % b
end

print(add(3, 5))           -- 输出 8
local q, r = divmod(10, 3) -- 多返回值
print(q, r)                -- 输出 3 1
```


## 🧰 局部函数与全局函数

```lua
function globalFunc()
  print("这是全局函数")
end

local function localFunc()
  print("这是局部函数")
end
```

> 建议使用 `local` 定义函数，避免污染全局作用域。



## 🧑‍🤝‍🧑 函数作为变量

函数可以赋值、存入表中、或作为参数传递：

```lua
local function sayHello()
  print("Hello Lua")
end

local f = sayHello
f()  -- 调用变量函数
```

## 🔁 匿名函数与回调函数

Lua 支持匿名函数，可作为回调函数使用。

```lua
function operate(a, b, func)
  return func(a, b)
end

print(operate(5, 3, function(x, y)
  return x * y
end))
```


## 🔄 可变参数函数

使用 `...` 表示可变参数。

```lua
function sum(...)
  local total = 0
  for _, v in ipairs({...}) do
    total = total + v
  end
  return total
end

print(sum(1, 2, 3, 4))  -- 输出 10
```


## 🧠 递归函数

Lua 支持递归函数定义。

```lua
function factorial(n)
  if n == 0 then
    return 1
  else
    return n * factorial(n - 1)
  end
end

print(factorial(5))  -- 输出 120
```


## 🧠 小结

* 使用 `function ... end` 定义函数
* 支持多返回值与可变参数
* 函数是 **一等公民**，可赋值、传递与返回
* 推荐使用 `local` 定义函数，避免全局污染
