《SPA设计与架构》之JavaScript模块化
原文
简书原文: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模块化的更多相关文章
- 《SPA设计与架构》之认识SPA
原文 简书原文:https://www.jianshu.com/p/84323f530223 大纲 前言 1.什么是单页面应用程序(SPA) 2.SPA与传统Web应用的区别 3.关于SPA的使用 4 ...
- 《SPA设计与架构》之MV*框架
原文 简书原文:https://www.jianshu.com/p/39f8f0aefdc2 大纲 1.认识MV*框架 2.传统UI设计模式 3.对框架的本质认识——框架有效性和框架分类 4.MV*基 ...
- 《SPA设计与架构》之客户端路由
原文 简书原文:https://www.jianshu.com/p/4d83475f71da 大纲 1.传统路由 2.SPA导航 3.客户端路由器的工作机制 1.传统路由 在传统Web应用程序中,导航 ...
- Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。
随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...
- Javascript模块化规范
Javascript模块化规范 一.前端js模块化由来与演变 CommonJS 原来叫 ServerJS,推出 Modules/1.0 规范后,在 Node.js 等环境下取得了很不错的实践.09年下 ...
- 深入了解Javascript模块化编程
本文译自Ben Cherry的<JavaScript Module Pattern: In-Depth>.虽然个人不太认同js中私有变量存在的必要性,但是本文非常全面地介绍了Javascr ...
- JavaScript模块化---AMD规范
JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...
- 知识点【JavaScript模块化】
JavaScript模块化历程 JavaScript发展变迁大概是一下几个步骤: 工具(浏览器兼容) 组件(功能模块) 框架(功能模块组织) 应用(业务模块组织) 但是经过了长长的后天努力过程Java ...
- 关于Javascript模块化和命名空间管理的问题说明
最近闲下来的时候,稍微想了想这个问题.关于Javascript模块化和命名空间管理 [关于模块化以及为什么要模块化] 先说说我们为什么要模块化吧.其实这还是和编码思想和代码管理的便利度相关(没有提及名 ...
随机推荐
- Font-Awesome最新版完整使用教程
何为Font-Awesome Font Awesome gives you scalable vector icons that can instantly be customized - size, ...
- 一起talk C栗子吧(第三十四回:C语言实例--巧用溢出计算最值)
各位看官们.大家好,上一回中咱们说的是巧用移位的样例,这一回咱们说的样例是:巧用溢出计算最值. 闲话休提,言归正转.让我们一起talk C栗子吧! 大家都知道,程序中的变量都有一个取值范围,这个范围也 ...
- js03 数组
变量的自动转换=== 等同符:不会发生类型的自动转化! == 等值符:会发生类型自动转化.自动匹配!判断相等没有equals()方法,只有2个等号3个等号. <!DOCTYPE HTML PUB ...
- onvif开发之设备发现功能的实现--转
忙了一个多月,onvif总算告一段落了.这几个星期忙着其他的项目,也没有好好整理一下onvif的东西.接下来得好好整理一下自己的项目思路和项目经验,同时将自己的一些心得写出来,希望对人有所帮助. 相信 ...
- web存储方法,现成代码
1.cookie的设置与取用 function setCookie(cname,cvalue,exdays){ var d = new Date(); d.setTime(d.getTime()+(e ...
- 【2017"百度之星"程序设计大赛 - 初赛(A)】度度熊的01世界
[链接]http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=775&pid=1006 [题意] 在这里写题意 [题 ...
- 一起talk C栗子吧(第九十八回:C语言实例--使用消息队列进行进程间通信二)
各位看官们,大家好,上一回中咱们说的是使用消息队列进行进程间通信的样例.这一回咱们接着上一回的内容继续说使用消息队列进行进程间通信.闲话休提.言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...
- touch、touchevent-事件总结
1.废话不多说,直接上代码,如下 package com.example.mygestrue; import android.support.v7.app.ActionBarActivity; imp ...
- 含有打印、统计DataGridView(1)
using System;using System.Collections.Generic;using System.Text;using System.Drawing.Printing;using ...
- Win7下IE11点击无反应的解决方法
平台:win7 sp1 32bit 问题:点击Internet Explorer在开始菜单.快捷栏的图标和安装目录下的程序均没有反应,鼠标在变成漏斗后恢复原状再无反应.但搜狗浏览器和360浏览器下使用 ...