JavaScript Weird Part (26) - 函數就是物件

在這堂課裡面,作者說明 JavaScript 當中一個重要的觀念「一級函數」(first class functions),也提到函數也是一種物件 (functions are object)。

一級函數 (First class functions)

一級函數是指說:你可以對別的型別像是物件、字串、數值、布林做的事情,都可以對函數做。

  • 你可以指派一個變數的值為函數
  • 你可以把函數當做參數傳入另一個函數
  • 可以用實體語法立刻創造函數。
  • 函數就是物件,所以也可以擁有屬性

一級函數可以改變你寫程式的方式,可以讓我們用一個完全不同的方法,解決你的問題。所以當我們說函數就是物件。函數物件長成什麼樣子?

函數物件 (Functions object)

就像 JavaScript 其他物件一樣,它被存在記憶體裡面,它是一個特殊型態的物件,它具有有所有物件的特色,還有一些其他的屬性和方法。

  • 函數可以連結純值

  • 連結名稱/值的配對

  • 連結物件

  • 連結其他函數。

  • 可以是匿名的

  • 特殊屬性:JavaScript 的函數不一定要有名稱,一個函數可以是匿名的,表示它沒有名字

  • 特殊屬性:程式屬性,你寫程式碼的位置,會成為函數物件的特殊屬性,這個屬性是特別的,因為他是可以呼叫的 (invocable),代表可以執行這個函數的程式。

這個函數模式相當重要,我們必須把函數想像成物件,而它的程式碼是那個物件的屬性之一。函數還包含許多其他東西。它可以被移動、複製、傳入任何一個東西,就像任何物件、值、字串、或數字一樣。

實際例子

這是一個函數,但在 JavaScript 裡面,函數就是物件,所以我們可以用 . 符號創造屬性。我們新增了一個函數的屬性,這在其他程式語言裡是不可能的,但在 JavaScript 函數就是物件,所以我們查詢這個函數的時候,會得出函數的文字。

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

greet.language='english';

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

1
console.log(greet);

但是如果我試圖找出函數的屬性,用. 運算子就可以找函數的屬性了,就像之前在一般物件做的那樣。

1
console.log(greet.language);

所以當建立函數的時候,實際上看起來像是這樣

以本例來說:

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

結論

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

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2020 CYC'S BLOG All Rights Reserved.

UV : | PV :