码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 立即执行函数在前端国际化方案中的应用


    说起国际化,开发过跨区域网页的小伙伴应该都遇到过。我们的网页需要配置多套语言,方便用户进行切换。

     

    本文就以 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
  • 相关阅读:
    不标年份的葡萄酒质量好吗?
    vue项目实际开发的问题及实用技巧分享(二)
    【Mongodb】READ_ME_TO_RECOVER_YOUR_DATA,数据库被恶意删除
    探索AI视频生成新纪元:文生视频Sora VS RunwayML、Pika及StableVideo——谁将引领未来
    1-STM32之GPIO点亮LED
    springboot+人事信息管理系统 毕业设计-附源码221507
    【1175. 质数排列】
    字典的基本概念
    AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀
    电网变电站安全作业行为规范检测-绝缘手套佩戴检测图像数据集(VOC,YOLO两类标签,六类目标)
  • 原文地址:https://www.cnblogs.com/xiaoxi666/p/17139449.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号