[JavaScriptWeird]No.25 函式就是物件

前言

在這節課中,作者說明了一個很重要的觀念,也就是在 JavaScript 中,函式也是物件的一種 (functions are object) 而且也會提到什麼是一級函式(first class functions)

一級函式 (First Class Functions)

一級函式從字面上看來或許很複雜,但其實不會。一級函式指的是,可以對別的型別,像是物件、字串、數值、布林做的事情,全部都可以對函式做。

例如

  • 可以指派一個變數的值為函式
  • 可以將函式當作參數傳入另一個函式
  • 可以在一個函式中回傳另一個函式
  • 函式就是物件,所以也可以擁有屬性 (property)

一級函式可以讓我們用完全不同的方法解決問題,所以當我們說「函式就是物件」,那麼函式物件是什麼東西呢?

函式物件 ( Functions Object )

就像 JavaScript 內的其他物件般被存放在記憶體,這是個特殊形態的物件,函式物件具有所有物件的特色,此外還有一些其他屬性:

  • 可以連結到純值 (Primitive)
  • 可以連結到物件 (Object)
  • 可以連結其他函式 (Function)
  • 特殊屬性 - 「名稱」,JavaScript 的函式物件可以是匿名的
  • 特殊屬性 - 「 程式屬性」,意思就是被包覆在函式內的程式碼,簡單來說,我們寫的程式會成為函式物件的特殊屬性。

程式屬性特別的是,這是可以被呼叫 (invocable) 的,代表可以執行這個函式的程式。

實際例子

1
2
3
4
5
function sayHi(){  
console.log('Hi');
}
sayHi.languaue = 'english';
console.log(sayHi);

像這樣,我新增了一個函式的屬性,就像前面介紹物件的文章一樣,運用點運算子為物件添加屬性,接著將輸出看結果。

如果直接這樣寫,會得到函式的文字內容,在這個範例中這樣子沒什麼用。所以必須使用點運算子取得函式物件的屬性,就像之前在一般物件做的那樣:

1
console.log(sayHi.languaue);

所以當我建立了這個函式,實際上它看起來像這樣:

以本例來說

  • 我建立了名稱為 sayHi 的函式物件
  • sayHi 的函式物件具有程式屬性,因為我寫了程式碼在裡面
  • 我可以在 sayHi 後面加上括號 () ,呼叫 sayHi 函式並執行

後記:

這樣的例子說明了,函式只是一種特殊的物件,它除了具有一般物件有的特性外,還有自身的特殊屬性。

0%