JS-基礎概念(下篇)

在上一篇中講到了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

在撰寫時建議採用後者的方式判斷較為嚴謹


LINE討論群FB討論區

歡迎您的加入,讓這個社群更加美好!

聯絡方式:
FaceBook
E-Mail