原文

  简书原文:https://www.jianshu.com/p/d5fc38506bc4

大纲

  1、什么是模块?
  2、基本的模块模式
  3、模块模式概念
  4、模块结构
  5、揭示模式
  6、模块编程的意义
  7、模块化编程的重要性

1、什么是模块?

  通常模块(Module)是指某个更大结构的一部分或组件。然而,模块术语依据不同上下文,甚至在软件开发范畴内,都可以用不同含义。有时我们会听到人们在一般意义层面讨论模块。比如,他们可能说“支付模块”或者“旅行计划模块”。这时候模块意指整体特性是完全没有什么问题的。而在我们特指JavaScript代码块的时候,模块就代表一个函数——一个通过模块模式创建的特定函数。

2、基本的模块模式

3、模块模式概念

3.1、命名空间

  命名空间是一种为一组相关成员提供具体作用域的方式。尽管命名空间当前并非JavaScript语言的一部分,但仍可以通过为更大作用域的任何变量(如全局变量)分配模块函数来达到同样效果。

3.2、匿名函数表达式

  函数表达式是表达式的一部分,且不以function关键字开头。如果函数表达式未命名,则被称为匿名函数表达式。模块体包含在一个匿名函数表达式当中。

3.3、对象字面量

  JavaScript提供了一种创建对象的快捷方式,被称为字面量标记法,其通过花括号声明一个对象,它的Property用键值对来表示。

3.4、闭包

  通常,当函数执行完毕,在其中创建的任何局部变量的生命周期也就宣告结束。闭包则是一个例外情况,当函数包含了外层作用域的变量引用时,例外就发生了。在JavaScript中,每个函数也都有一个外层作用域,即使外层作用域恰好就是全局作用域(所以从技术角度来讲,所有函数都是闭包)。闭包对于我们的讨论内容是非常重要的,因为即使模块模式的外层函数立即执行完毕,只要模块仍在使用,外层函数返回语句所引用作用域链之上的任何对象或值,都无法被垃圾回收。

4、模块结构

  模块结构巧妙地使用一个函数作为封装其逻辑的容器。这是可能的,因为在模块中局部声明变量及函数可以避免模块外部直接访问它们。模块内部功能的访问可以通过访问语句暴露的内容来控制。

5、揭示模式

  模块模式的吸引力之一就是在模块内部功能与公开功能之间划定了清晰的界限。有一种频繁用到并能够让划分更加清晰的改良版模块模式——揭示模式(revealing module pattern)。
  其实现思路是:将任何API所需代码移到内部,将公有函数作为纯粹指向内部代码的指针,并只暴露该公有函数。

6、模块编程的意义

6.1、避免命名冲突

  不用模块限制函数作用域,把函数一股脑地放进全局作用域,将很容易导致命名冲突
  模块模式能够让你按自己意愿命名变量或函数,而不用担心不同模块代码间会产生命名冲突问题

6.2、保护代码完整性

  在某些语言中,访问某部分应用程序代码可以通过注入public或private这样的访问修饰符来控制。而在JavaScript中private是保留关键字。我们仍然可以通过模块模式限定变量和函数的访问权限。这是可能的,因为在某个函数里声明的变量和函数,意味着它们的作用域已限制为容器函数。这种限制访问某部分模块代码的能力将组织其他代码直接改变其内部状态,维系模块内部正常运作,并避免模块数据遭到肆意修改导致违背其预期目的。
正确编写安全的代码难度很大。如果你无法阻止代码内逻辑的错误使用,编写安全代码的希望就愈发渺茫。模块模式提供了一种管理内部代码访问性的方式。

6.3、隐藏复杂性

  当讨论隐藏编程复杂度时,并非说我们想讨论如何保守秘密或者如何增加安全性。我们要讨论的是两种方式的差异性:通过大量全局函数实现具体功能的复杂逻辑,以及将复杂逻辑放至内部并只通过公有接口暴露开发者所需功能。后者减少了混乱,并使得函数调用更加清晰起来,以正确使用应用功能。

7、模块化编程的重要性

  模块化编程最重要的思想:通过模块模式来内化逻辑复杂性并提供功能对应公有API,这是JavaScript的封装实现方式。
模块化的代码能够将应用逻辑组织成单一目标的更小单元,其更容易管理及修改。毫无疑问这带来了更好的可重用性。模块还有助于保持数据完整性、代码组织以及避免命名冲突。毕竟我们为无刷新的单一页面编写代码,如果不按这种设计方式编写代码,纯粹依赖全局变量和函数的话,代码将很快变得难以管理。

《SPA设计与架构》之JavaScript模块化的更多相关文章

  1. 《SPA设计与架构》之认识SPA

    原文 简书原文:https://www.jianshu.com/p/84323f530223 大纲 前言 1.什么是单页面应用程序(SPA) 2.SPA与传统Web应用的区别 3.关于SPA的使用 4 ...

  2. 《SPA设计与架构》之MV*框架

    原文 简书原文:https://www.jianshu.com/p/39f8f0aefdc2 大纲 1.认识MV*框架 2.传统UI设计模式 3.对框架的本质认识——框架有效性和框架分类 4.MV*基 ...

  3. 《SPA设计与架构》之客户端路由

    原文 简书原文:https://www.jianshu.com/p/4d83475f71da 大纲 1.传统路由 2.SPA导航 3.客户端路由器的工作机制 1.传统路由 在传统Web应用程序中,导航 ...

  4. Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。

    随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...

  5. Javascript模块化规范

    Javascript模块化规范 一.前端js模块化由来与演变 CommonJS 原来叫 ServerJS,推出 Modules/1.0 规范后,在 Node.js 等环境下取得了很不错的实践.09年下 ...

  6. 深入了解Javascript模块化编程

    本文译自Ben Cherry的<JavaScript Module Pattern: In-Depth>.虽然个人不太认同js中私有变量存在的必要性,但是本文非常全面地介绍了Javascr ...

  7. JavaScript模块化---AMD规范

    JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?     模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...

  8. 知识点【JavaScript模块化】

    JavaScript模块化历程 JavaScript发展变迁大概是一下几个步骤: 工具(浏览器兼容) 组件(功能模块) 框架(功能模块组织) 应用(业务模块组织) 但是经过了长长的后天努力过程Java ...

  9. 关于Javascript模块化和命名空间管理的问题说明

    最近闲下来的时候,稍微想了想这个问题.关于Javascript模块化和命名空间管理 [关于模块化以及为什么要模块化] 先说说我们为什么要模块化吧.其实这还是和编码思想和代码管理的便利度相关(没有提及名 ...

随机推荐

  1. 洛谷 P1850 换教室

    P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq ...

  2. Impala的安装(含使用CM安装 和 手动安装)(图文详解)

    Impala有两种安装方式: 1)使用CM安装Impala 2)手动安装Impala 注意:Impala不支持在Debian/Ubuntu, SuSE, RHEL/CentOS 6.5系统中安装. 基 ...

  3. Linux下文件的管理

    1.文件的创建(touch) xiaohuang@xiaohuang-virtual-machine:~/桌面$ touch myfile.txt xiaohuang@xiaohuang-virtua ...

  4. Java开源电商项目比較

    这里比較的都是国外的开源项目,备选项目有: Smilehouse Workspace.Pulse.Shopizer.ofbiz.bigfish.broadleaf 1.Smilehouse Works ...

  5. 设计模式之十二:状态模式(State)

    状态模式: 当一个对象的内部状态发生变化时同意改变它的行为. Allow an object to alter its behavior when its internal state changes ...

  6. curl如何发起DELETE/PUT请求

    curl如何发起DELETE/PUT请求 DELETE: curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); PUT: curl_setopt($ch ...

  7. [appium]-9宫格解锁方法

    from appium.webdriver.common.touch_action import TouchAction TouchAction(self.driver).press(x=228,y= ...

  8. c++中的相对路径

           今天在vs2010里读取相对路径下的图片文件出了点问题.于是查了一下相对路径的编程知识,记录下来分享给大家:      问题描写叙述:path=".\\TrainData\\& ...

  9. CC2530定时器使用

     定时器学习   文件夹 说明 依据数据手冊可知CC2530总共同拥有4个定时器,可是定时器2被系统占用,可用的仅仅有三个,分别为定时器1/3/4 Timer在协议栈的代码位置为hal_timer ...

  10. JS错误记录 - 按左右箭头div移动、一串div跟着鼠标移动

    本次练习错误总结: 1. div跟着用户操作而移动,首先必须要绝对定位,否则无法移动. 2. if条件语句里面是双等号,不是单等号(赋值). 3. 坐标值没有Right,只能offsetLeft 加减 ...