---
title: "什麼是 Solidity 函式？"
description: "Solidity 函式類型：View、Pure、Special、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 速成課程。如果開發者對開發工作完全陌生，Alchemy University 的[**3 週 JavaScript 速成課程**](https://www.alchemy.com/university/courses/js)是開始 Ethereum bootcamp 之前很好的先修課程。
