前端亂彈99日之函式是一等公民
拖延症晚期癌,每次都是週日最後一個小時才開始動筆,先鄙視下自己
今天要“彈”的是一個有點被說“爛”了的話題,在JavaScript裡,函式是一等公民(哇,聽起來很高大上吧),而同時在這個函數語言程式設計異常火爆的年代,你到底該怎麼理解“函式是一等公民”這句話呢?
其實,我們也可以換個角度來看,在JavaScript裡,任何東西都是物件(嗯,還是要刨掉原始型別),作為一個後端狗,在讀《Java程式設計思想》這部“鉅著”的時候,記得有那麼一句“萬事萬物皆是物件”,那麼在JavaScript裡離這句話就更近了一些,下面就先看一個例子吧
var log = function(a){
console.log("invoke:"+a);
}
log.name = "日誌";
console.log(log.name);
這裡,我們不僅可以將一個函式賦值給一個變數,甚至還可以給這個變數再增加一個屬性。那麼上面這個log
這個到底是個函式呢還是個物件呢?
其實,在JavaScript裡,函式只是一個更特殊的物件,他首先擁有物件的一切能力,接著,他還有額外的一個特殊的部分,可以成為執行部分,或是程式碼部分,那麼接著一個更酷的事情就是,我們可以這樣使用log
這個變數。
var log = function(a){
console.log("invoke:"+a);
}
log.name = "日誌";
log("Just A Test");
這段程式碼,將會輸出
invoke:Just A Test
嗯,如果將一個函式賦值給一個變數之後,我們只需要在這個變數後面增加()即,代表這是一個函式式的物件,可以執行,這裡()更適合一種“運算子”,嗯,就叫執行運算子。
而如果一個變數本身不是指向的了一個函式的話,強行呼叫()會報錯,我們可以試試這樣一段程式碼
var a = {
"name" : "value"
}
a();
這裡,我們定義了一個變數a,而變數a實際“指向”的是一個物件,並不是函式,這時我們強行呼叫()的話,會報這樣的錯誤:
Uncaught TypeError: a is not a function
報錯資訊很明確,a並不是一個函式。
另外,有關前面曾經聊過的“變數提升”的問題,這裡也是需要再說一說的。
我們之前明確過,一個函式定義是會在執行時環境構建的適合就處理完成,因此一個函式的定義和呼叫的順序是無關的。
比如這段程式碼
log("just a test");
function log(a){
console.log(a);
}
這裡我們已經很清楚,是可以正確執行的,那麼如果我們換一種方法呢:
log();
var log = function(a){
console.log(a);
}
這時是會報錯的:
Uncaught TypeError: log is not a function
因為這裡,log只是一個普通的變數,JavaScript的執行時環境並不會把他作為一個函式,對他提前的初始化,這樣的報錯就更好理解了。
那麼對於函數語言程式設計在JavaScript裡的運用,那就更是一個有意思的話題了,今天我們只是框清了一個概念“在JavaScript裡,函式只是一個特殊的物件而已”
相關文章
- javascript一等公民------函式JavaScript函式
- 再談函式和一等公民函式
- Go函式介紹與一等公民Go函式
- JS學習筆記之再理解一等公民--函式(基礎篇)JS筆記函式
- python技巧 一等函式Python函式
- 前端之jquery函式庫前端jQuery函式
- 前端之函式柯里化Currying前端函式
- Python學習之路24-一等函式Python函式
- 開開森森學前端之函式式元件和JSX前端函式元件JS
- web前端開發教程:函式是什麼Web前端函式
- 關於Python一等函式的一點實踐Python函式
- 前端Vue:函式式元件前端Vue函式元件
- 前端學習之PHP基礎函式總結前端PHP函式
- C++之類解構函式為什麼是虛擬函式C++函式
- 前端入門——函式前端函式
- 前端 help 助手函式前端函式
- 《前端之路》之 JavaScript 高階技巧、高階函式(一)前端JavaScript函式
- Kotlin之“with”函式和“apply”函式Kotlin函式APP
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- 函式: 函式是怎麼使用的?函式
- 前端基礎(三):函式前端函式
- 前端常用函式封裝前端函式封裝
- 常見函式之單行函式函式
- 前端筆記之JavaScript(七)深入函式&DOM那點事前端筆記JavaScript函式
- PHP函式漏洞審計之addslashes函式-PHP函式
- 前端演算法之彈幕設計前端演算法
- Python學習之路25-使用一等函式實現設計模式Python函式設計模式
- 前端筆記之JavaScript物件導向(一)Object&函式上下文&建構函式&原型鏈前端筆記JavaScript物件Object函式原型
- 前端建構函式、原型、例項物件之間的關係前端函式原型物件
- web前端教程之JavaScript學習筆記之遞迴函式Web前端JavaScript筆記遞迴函式
- 什麼是Python函式?如何定義函式?Python函式
- Python之函式5.1Python函式
- 函式之遞迴函式遞迴
- linux之__setup函式Linux函式
- Python之operator.itemgetter函式和sorted函式Python函式
- 【Spark篇】---SparkSql之UDF函式和UDAF函式SparkSQL函式
- 從settTimeout到匿名函式、箭頭函式之() => {}函式
- 函式的祕密之 函式返回值函式