說起國際化,開發過跨區域網頁的小夥伴應該都遇到過。我們的網頁需要配置多套語言,方便使用者進行切換。
本文就以 React 為例,介紹其中一種實現方案,並學習一下其中的知識點。
一種國際化方案
方案是這樣的:
-
為多套語言建立對應的 object,並 export 出去
-
透過 js 立即執行函式,載入選定語言 js 檔案中的 object,並 export 出去
-
專案中引入第 2 步中 export 的 object,直接使用即可
圖示(假設支援中英兩種語言):
加上業務檔案引用後,全景圖如下:
可以看出來,其實 lang/index.js 檔案起到了一種「介面」的作用,幫我們遮蔽了語言型別。在實際情況中,我們可以讓瀏覽器自動獲取特定 cookie,並藉助 js 立即執行函式,將對應的語言包 object 暴露出去,此時業務程式碼中引用的地方就可以自動獲取到對應的語言,進而展示:
你看,這種方案是不是超級簡單?
下面我們來看看其中涉及到的一個重要知識點:立即執行函式。
什麼是立即執行函式?
-
首先,它是一個匿名函式;
-
其次,它在宣告後會被立即執行;
-
最後,使用圓括號加以呼叫。
這就是它的最簡定義了。
我們把上面用到的程式碼簡化一下:
在 js 中,function 這個關鍵字,既可以當做語句,也可以當做表示式,上面立即執行函式的寫法,其實就是把 function 當作表示式了。
插入一個關鍵知識:
如何讓 function 當作表示式呢?我們看下 JS 引擎的規定:如果 function 出現在行首,則解析成語句。對於語句來說,不能以圓括號結尾,否則報錯。
所以,只要想辦法讓 function 被解析為表示式,就可以得到 立即執行函式的多種寫法,我們總結一下:
注 1:圖中展示的是無參形式,也可以存在形參和實參。
可以看出,不同形式的寫法,具有不同的返回值。在本文的國際化例子中,我們在方法體中 return 了語言包 object,並不關心函式的返回值,所以可以隨意使用任意寫法:
那麼問題來了,立即執行函式有啥用武之地?
立即執行函式的幾大作用
-
使用匿名函式,無需為函式命名,避免汙染全域性變數
-
它的內部形成了一個單獨的作用域,可以封裝外部無法讀取的私有變數
第一點很好理解,我們看看第二點在說什麼。
繼續用國際化的例子說明,我們其實把 cookie 封閉在了 lang/index.js 檔案中,外部檔案是無法讀取到這個 LocaleCode 這個私有變數的(其實也根本不關心),這就是所謂的封裝帶來的安全性。
擴充套件到高階函式
作為 js 中的一等公民,函式不僅擁有一切傳統函式的使用方式(宣告和呼叫),而且可以做到像簡單值一樣賦值、傳參、返回。所以我們完全可以讓立即函式返回一個函式,舉個例子:
看一下執行結果,就很好理解了:
所以,你可以盡情把高階函式的能力帶到立即執行函式中。
一句話總結:立即執行函式的作用域封閉能力可以很優雅地實現一些現實業務訴求,還可以結合高階函式實現更為複雜的功能,希望大家都能靈活掌握並運用。
最後,本文部分內容參考了文章:https://www.jianshu.com/p/b10b6e93ddec,推薦一讀。