---
title: "什么是 Solidity 函数？"
description: "Solidity 函数类型：View、Pure、特殊函数、Fallback 及函数可见性"
---

# 什么是 Solidity 函数？

[Solidity](https://www.alchemy.com/overviews/solidity) 函数有多种类型，包括 view 函数、pure 函数、特殊函数和 fallback 函数。函数还可以通过 public、external、internal 和 private 这几种函数可见性修饰符来修饰。本文将介绍 Solidity 函数类型、语法，以及如何读懂函数和可见性。

## **什么是 Solidity 函数？**

**Solidity 函数是完成特定任务的独立代码模块。** 与其他[web3 编程语言](https://www.alchemy.com/overviews/web3-programming-languages)一样，Solidity 允许开发者通过函数编写模块化代码，从而消除重复编写同一段代码的冗余。开发者可以在程序中需要的时候调用某个函数，而不必重写代码。

## **如何编写和读懂 Solidity 函数**

编写 Solidity 函数时，开发者需要按照正确的语法来组织函数，并确保写出其基本组成部分，以保证函数能够正确执行。

### **Solidity 函数语法**

按照以下语法来创建你的 Solidity 函数，如下例所示：

1. 使用 function 关键字来定义函数
1. 为函数创建一个名称，该名称必须唯一，且不能与任何保留关键字重合
1. 列出参数（包含参数的名称和数据类型），或不包含额外参数
1. 创建一个用花括号包裹的语句块

注意：[Solidity 事件](https://www.alchemy.com/overviews/solidity-events)的声明方式与函数类似。事件和函数对于高层次的 dApp 开发都是不可或缺的。

下图展示了 Solidity 函数的三个主要组成部分：

1. 函数名
1. 函数类型
1. 返回类型

<ImageBlock
  src="https://media.alchemy.com/1703927821-example-of-a-function-in-solidity.png"
  alt="Solidity 中函数的示例"
  width={960}
  height={540}
  caption="Solidity 中函数的示例"
/>

## **Solidity 函数有哪些不同类型？**

**本节将介绍 Solidity 函数的各种类型**，包括 view 函数、pure 函数、特殊函数和 fallback 函数。

### **1. View 函数**

在 Solidity 中，view 函数是只读的，不能改变智能合约中定义的状态变量。view 函数的语法如下：

### **2. Pure 函数**

pure 函数声明不会改变或读取任何状态变量。pure 函数通常用于一些通用的工具或计算。pure 函数的语法如下：

### **3. 特殊函数**

Solidity 提供了几种在开发智能合约时可以使用的特殊函数。getter 函数和 receive 函数是 Solidity 智能合约中重要的[可支付函数](https://www.alchemy.com/docs/solidity-payable-functions)。

#### **Getter 函数**

被声明为 public 的状态变量会由编译器自动创建一个 getter 函数。该函数与变量同名，并具有 external 可见性。

#### **Receive ether 函数**

一个合约最多只能有一个 receive 函数。receive 函数不能带参数，也不能有返回值，且必须具有 external 可见性和 payable 状态可变性。

当对合约发起一次发送 Ether 且未指定任何函数的调用时，就会执行 receive 函数。该函数声明方式如下：

### **4. Fallback 函数**

在 Solidity 中，fallback 函数是一个没有名称、参数或返回值的 external 函数。当函数标识符与智能合约中任何可用函数都不匹配，或调用函数时没有附带任何数据时，就会执行 fallback 函数。

### **什么是函数重载？**

当同一作用域内针对同一个函数名存在多个定义时，就发生了函数重载。这些函数的定义之间必须在参数列表的类型和/或数量上有所不同。仅返回类型不同的函数声明不能构成重载。

#### **Vyper 处理函数重载的方式与 Solidity 有何不同？**

与 Solidity 不同，Vyper（一种[基于 Solidity 的 Python 风格语言](https://www.alchemy.com/overviews/solidity-vs-vyper)）不支持函数重载。在 Vyper 中尝试进行函数重载会导致 “Duplicate function or event name” 错误。

## **函数可见性是什么意思？**

指定函数可见性可以让我们[**控制哪些实体可以调用**](https://www.alchemy.com/university/courses/ethereum?a=703dc50260)智能合约内的函数。调用者共有三种类型：

1. 主合约本身
1. 从主合约派生（即继承）而来的合约
1. 第三方

函数可见性能帮助你控制上述哪些调用者可以执行该函数。函数可见性共有四种类型：

1. Public
1. External
1. Internal
1. Private

函数的可访问性从 External 到 Private 依次递减：public 函数的可访问性最高，private 函数的可访问性最低。

### External 与 public 的区别

External 和 public 是可以从合约定义范围之外调用的两种函数可见性。External 表示该函数只能被其他合约或外部拥有账户（EOA）调用。Public 表示该函数既可以从外部调用，也可以从合约内部调用。

### **Internal 与 private 的区别**

与 external 和 public 不同，internal 和 private 都不允许外部方访问该函数。对于 private 函数，只有同一合约内的函数才能调用它。对于 internal 函数，同一合约内的函数或派生合约内的函数都可以调用它。

## **继续学习 Solidity 函数**

本文向你介绍了 Solidity 中的函数。想继续学习，可以报名 [**Alchemy University 的 Ethereum Developer Bootcamp**](https://www.alchemy.com/university/courses/ethereum?a=703dc50260)，免费学习为期 7 周的异步 Solidity 速成课程。如果开发者对开发本身还比较陌生，那么在开始 Ethereum bootcamp 之前，Alchemy University 的[**为期 3 周的 JavaScript 速成课程**](https://www.alchemy.com/university/courses/js)是一个不错的先修课程。
