> For the complete documentation index, see [llms.txt](https://chihaolu.gitbook.io/all-in-one-solidity/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://chihaolu.gitbook.io/all-in-one-solidity/part-i-basic/chapter-5-han-shi-function/visibility.md).

# 【Visibility】

首先我們要知道可以調用一個「函數」的角色有三者，分別為：

* 當前合約 (MyContract)
* 繼承合約 (DerivedContract)
* 其他合約 (AnotherContract)

當前合約與繼承合約兩者合稱內部（internal），而其他合約不屬於我們這個「家族」因此被稱為外部（external）。

在 Solidity 中可視性可以定義此函數執行或訪問上的權限。

```solidity
contract MyContract {
    function myFunction () [visibility-here] {
        // do something
    }
}
```

* `public` - 任何的合約和帳戶都可以呼叫這個函數，也就是在合約的外部和內部均可見。
* `private` - 只有當前合約可以呼叫這個函數，任何外部或繼承合約皆不可呼叫。
* `external` - 只有除了自己和繼承合約以外的合約或帳戶可以呼叫此函數。&#x20;
* `internal` - 只有自己和繼承合約的合約或帳戶可以呼叫此函數。&#x20;

如果真的不知道一個函數的可視性該是什麼，把一個函數設為 `private` 是一個好習慣，在測試的時候再根據使用情況回去把程式碼裡面的函數改成我們要得權限。
