立即執行函數在前端國際化方案中的應用

来源:https://www.cnblogs.com/xiaoxi666/archive/2023/02/20/17139449.html
-Advertisement-
Play Games

說起國際化,開發過跨區域網頁的小伙伴應該都遇到過。我們的網頁需要配置多套語言,方便用戶進行切換。 本文就以 React 為例,介紹其中一種實現方案,並學習一下其中的知識點。 一種國際化方案 方案是這樣的: 為多套語言創建對應的 object,並 export 出去 通過 js 立即執行函數,載入選定 ...


說起國際化,開發過跨區域網頁的小伙伴應該都遇到過。我們的網頁需要配置多套語言,方便用戶進行切換。

 

本文就以 React 為例,介紹其中一種實現方案,並學習一下其中的知識點。

 

一種國際化方案

 

方案是這樣的:

  1. 為多套語言創建對應的 object,並 export 出去

  2. 通過 js 立即執行函數,載入選定語言 js 文件中的 object,並 export 出去

  3. 項目中引入第 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​,推薦一讀。​

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back 『註:本文來自博客園“小溪的博客”,若非聲明均為原創內容,請勿用於商業用途,轉載請註明出處http://www.cnblogs.com/xiaoxi666/』
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天非常的倒霉,因為學習了Vue的相關知識,想自己寫一個後端伺服器來練習一下Vue 然後 忘記了Docker中Mysql的密碼。。。 很抽象 下麵是我的解決方法 一、如果在本地的Navicat Premium上連接過資料庫,就可以使用工具導出連接 二、用編輯器打開導出的鏈接文件 就可以看到 用戶名、 ...
  • 一:背景 1. 講故事 相信大家在使用 SQLSERVER 的過程中經常會遇到 阻塞 和 死鎖,尤其是 死鎖,比如下麵的輸出: (1 row affected) Msg 1205, Level 13, State 51, Line 5 Transaction (Process ID 62) was ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:vatebur 文章來源:GreatSQL社區投稿 UOS二進位安裝資料庫和其他 Linux 基本一樣,網上命令行安裝的教程很多。考慮到 UOS ...
  • 本文介紹了TiDB資料庫特性及在之家的發展歷程,典型業務應用場景,TiDB具有相容MySQL協議,易水平擴展、高可用、強一致,HTAP等特性,在之家多個重要業務得到應用。另外文章還介紹了之家TIDB自動化運維建設情況及應用實踐遇到的問題及解決。 未來之家TiDB計劃繼續進行TiDB運維體系建設,並... ...
  • 本文內容主要翻譯自issue 中國外大佬對防抖與節流的解釋, 後面補充了自己的理解和總結。 什麼是防抖與節流 防抖和節流是處理“過於頻繁”發生的事情的常用技術。想象一下,你和朋友見面,朋友正在給你講一個故事,但他們說話時很難停下來。假設您想在可能的情況下不打斷他們滿足他們講故事的興緻,同時還要回應他 ...
  • 本文首發我的博客,github 地址 大家好,我是徐公,今天為大家帶來的是 RxJava 的一個血案,一行代碼 return null 引發的。 前陣子,組內的同事反饋說 RxJava 在 debug 包 crash 了,捕獲到的異常信息不全。(即我們捕獲到的堆棧沒有包含我們自己代碼,都是一些系統或 ...
  • 常見問題一:如何驗證Analytics是否上報/接入成功?以及關鍵日誌含義是什麼? 在初始化Analytics SDK前添加SDK日誌開關如下: HiAnalyticsTools.enableLog (); 2.初始化SDK代碼如下: HiAnalyticsInstance instance = H ...
  • 項目的奇葩需求,需要彈出Dialog不要顯示狀態欄和導航欄,記錄一下解決方法 原文地址:Android 關於Dialog在全屏彈出會顯示狀態欄和導航欄的問題解決 Stars-one的雜貨小窩 說明 Android的原生的Dialog有個問題,如果你的Activity設置為全屏的,然後顯示Dialog ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...