[JS奇怪的世界]No.26 函數就是物件

函數就是物件

相信很多人看到這個標題都會有點霧煞煞,讓我們來討論最基礎最根本的概念,進而更深入瞭解讓我們不只是會用 JavaScript,而是讓我們能夠將 JavaScript 使用成其他語法語法無法匹敵的強大工具,而這概念稱之為一級函數(first class function)

在 JavaScript 世界即為函數就是物件

函數就是物件

一級函數在程式語言中 JavaScript 並不是唯一擁有一級函數的程式語言,課程上的說法比較模糊,所以我們參考至 pjchender 會比較清楚什麼是一級函數 ↓

pjchender 一級函數

那函數物件是什麼?課程上提供了一個不錯的圖來講解,它是一個特殊形態的物件,它與所有物件的特色及一些其他屬性。

  • 函數可以連結到名稱/值配對
  • 連結物件
  • 連結其他函數

函數物件

在 JavaScript 中還有一些特別的屬性

  • 函數不一定要有名稱
  • 另一個比較特別,叫程式屬性又稱程式區塊

特別的屬性

那直接來看程式碼或許會更清楚。

1
2
3
function greet() {
console.log('hi');
}

這邊我們要記住一個觀念,函數就是物件,所以我們可以使用點運算子來創造物件。

1
2
3
4
5
function greet() {
console.log('hi');
}

greet.language = 'english';

在其他程式語言中是不可能這樣做,絕對會出現錯誤,但是 JavaScript 可以這樣做,但是在這邊若是輸出 console 就會發生有趣的事情。

hi

我們只有得到 hi,那 english 呢?我們試著這樣找看看

1
2
3
4
5
6
7
function greet() {
console.log('hi');
}

greet.language = 'english';
greet()
console.log(greet.language);

greet.language

oh,可以找到 language,那如果這樣寫會得到什麼呢?

1
2
3
4
5
6
7
function greet() {
console.log('hi');
}

greet.language = 'english';
greet()
console.log(greet);

greet

我們可以看到 language 是 名稱/值的配對也就是物件。

程式碼的容器

所以課程有說明,我們必須想像函數只多了可以寫程式碼的容器,實質上它還是一個物件。

JavaScript 中函數就是物件,而且是一個特殊的物件。

圖源

JavaScript 全攻略:克服 JS 奇怪的部分

參考文獻

pjchender

0%