在上一篇中講到了JS的型別、記憶體的管理、var的特性、刪除的屬性,以及可以完整優化速度的IIFE。
在這篇來講個自動轉型以及閉包吧!
前陣子聽同事問我什麼是閉包,上網找了半天還看不出所以然,但上了保哥的課之後就豁然開朗了。
閉包是在函式中,再返回一個函式。
為什麼要這樣做呢?
我分三個版本來解釋,希望可以讓大家更清楚一點
JS版本:
在JS之中,由於var在函式之中的生命週期僅限於 當前宣告函式的最外層,而在閉包中所建立的函式,則是必須在物件建立並儲存後,再透過變數去呼叫物件的底下的方法。
C#版本
在C#之中,由於屬性在物件之中的生命週期僅限於當前類別,而在類別所建立的方法,則是必須在new Class並儲存變數後,再透過變數去呼叫物件的底下的方法。
這樣講聽起來應該還是很抽象,那就當成類別裡面有一個屬性、一個方法,而這個屬性僅供當前的執行個體所叫用。
一般後端工程師看到這段應該可以了解了。
如果不了解的話,建議去上SkillTree的OOP課程 (真的很實用的課程)
因此閉包會有外層函式(類別)中,包有變數+內層函式的情形,這種設計方法使得內層函式可以任意使用當前的資料,並且不會跟其他同名資料衝突,同時也具備有物件高內聚低耦合的特性。
說到這邊就趕快來看看Code吧!
// 宣告外層函式
function MyFunc(){
// 宣告出一個i的屬性 初始值為5
var i = 5;
// 回傳一個物件,裡面有GetCount的函式
return {
// 這裡面的i是透過上方的var i 宣告而來,因此可以重複使用
GetCount: function (){
// 注意!第一次執行時,才會把i的值傳入
// 所以第一次會回傳5
// 第二次才是6
return i++;
}
}
}
// 建立執行個體
var o = MyFunc();
// 取得i + 1
o.GetCount(); // 5
// 取得i + 1
o.GetCount(); // 6
是說我對於第一次執行時,為什麼是返回初始值這點感到滿好奇的,但這功能比較少用,之後踩到雷了再繼續追下去XD
至於自動轉型呢?那就更簡單了!
三個等號屬於不判斷型別,二個等號屬於自動轉型後再判斷資料
看Code吧
1=="1" // true
1==="1" // false
在撰寫時建議採用後者的方式判斷較為嚴謹
歡迎您的加入,讓這個社群更加美好!