---
# System prepended metadata

title: '筆記_重新認識JS:Day17函式裡的「參數」(上)_一級函式'
tags: [javascript]

---

# 筆記_重新認識JS:Day17函式裡的「參數」(上)_一級函式
---
###### tags: `javascript`

[JavaScript 一級函式 （First Class Functions）](https://wcc723.github.io/development/2020/09/24/first-class-function/)

[重新認識 JavaScript: Day 17 函式裡的「參數」](https://ithelp.ithome.com.tw/articles/10192368)

----

一級函式
一級函式並非是 JavaScript 專有的特性，只要該語言的「函式可被視為與其它變數一樣時」，就可以稱為該語言有一級函式的特性。

> functions in that language are treated like any other variable


## >> PHP 也支援一級函式

----

JavaScript 的函式就具有以下特性：

1. 將函式指定到一個變數
2. 函式可作為參數來傳遞
3. 函式也可以被回傳（return）
4. 函式也是物件的物件（傳參考特性、具有屬性）

```javascript=
// 把函式存入「變數」, 呼叫時執行 funcA();
var funcA = function(){};

// 把函式存入「陣列」, 呼叫時執行 funcB[0]()
var funcB = [function(){}];

// 把函式存入「物件」的屬性, 呼叫時執行
// funcC.method() 或 funcC['method']()
var funcC = { method: function(){} };

// 把函式當作「參數」，傳入到另一個函式中。
var funcD = function(func){
  return func;
};

// 「另一個」函式: 存放的是 funcD，而參數為一個匿名函式
var runFuncPassedToFuncD = funcD(function(){console.log('Hi');});

// 呼叫「另一個」函式
runFuncPassedToFuncD();   // "Hi"
```

```javascript=
// 函式是「物件」的一種，當然也可以有自己的「屬性」
var funcE = function(){};
funcE.answer = 'yup';

console.log(funcE.answer);      // 'yup'
```
> 當我們透過 typeof 去檢查某個函式的時候，雖然你會得到 "function" 的結果，讓你以為 function 也是 JavaScript 定義的一種型別，但實際上它仍屬於 Object 的一種。

> 函式是一種物件，值也是物件。 你可以把它想像成是一種可以被呼叫 (be invoked) 的特殊物件 (值)。

### 函式是一種物件,值也是物件
### 函式是Object的一種

---
---

練習：

![](https://i.imgur.com/ntI7Sju.png)

