2019独角兽企业重金招聘Python工程师标准>>>

随着前段JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试。模块化是一种非常好的代码组织方式,本文试着对JavaScript模块化开发的一些基础知识做一些阐释。

对象字面量(Object Literals)

对象字面量表示,其实就是用一对大括号括起来的键值对,也就是JavaScript声明对象的方式。

var myObject = { variableKey : variableValue, functionKey : function() { ... } }

比较一下下面代码声明方式,使用对象字面量表示,可以减少全局变量的污染,一般来说,强烈建议在任何时候都不要使用下面的声明方式:

var variableName = ...; function name1(){ ... } function name2(){ ... }

立即执行函数(IIFE Immediately-Invoked Function Expressions)

立即执行函数是现在非常流行的写法,大部分JS库都使用了这种技巧,主要是防止全局变量的污染。

当我们在声明类似于var name1 = function (){ … }这样的函数时,在后面加一对括号 (),就可以让它立即执行,但是如果是function name1() { … }这样的函数,则会有问题:

function name1(){ alert("123"); }();

上面代码在执行时会抛出错误,Unexpected token(意外的标记),因为后面的()会被解析为分组操作符。

解决上面的问题,只需要加上括号将function代码全部括住即可,下面就是立即执行函数的声明方式:

(function () { /* code */ } ()); (function () { /* code */ })();

注意,上面两种方式都是可以的,主要看个人习惯。立即执行函数可以不对外暴露私有变量,比如:

var myObject = { name : "FeeldesignStudio", getName : function(){ return this.name; } }; myObject.name; //FeeldesignStudio myObject.getName(); //FeeldesignStudio var myObject = (function(){ var name = "FeeldesignStudio"; return { getName : function(){ return name; } } })(); myObject.name; //出错! myObject.getName(); //FeeldesignStudio

导入全局变量

把全局变量作为参数传递给一个立即执行函数,这样就完成了全局变量的导入,立即执行函数中可以使用此全局变量的方法,并可以修改(简化)全局变量的名称:

var myModule = (function ( jQ ) { function method1(){ jQ(".container").html("test"); } return{ publicMethod: function(){ method1(); } }; })( jQuery ); myModule.publicMethod();

模块导出

当然,有导入也可以有导出,有时我们不仅要导入全局变量,也要把模块导出到全局空间供其他模块使用。通过在立即执行函数中返回一个Object,就可以实现模块导出功能:

var myModule = (function () { var module = {}, privateVariable = "Feeldesign"; function privateMethod() { // ... } module.publicProperty = "FeeldesignStudio"; module.publicMethod = function () { console.log( privateVariable ); }; return module; })();

扩展模块

在开发中,我们经常会对一些模块进行扩展,扩展当然可以直接修改模块的源代码,但是这不是一个好的方法,比如我们要给 myModule 模块增加几个方法,通过前面的“立即执行函数”、“导入全局变量”、“模块导出”的知识,我们可以推导出下面的扩展方式:

var myModule = (function ( my ) { my.xxMethod = function () { ... }; return my; })( myModule );

问题来了:上面的代码可以很好地对 myModule 进行扩展,不过前提是 myModule 必须已经定义,如果扩展的 xxMethod 方法和 myModule 本身没有任何的依赖,那么要求 myModule 必须已经定义就毫无必要了,怎么解决这个问题呢,非常简单,只需要或一个空对象:

//松散扩展 var myModule = (function ( my ) { my.xxMethod = function () { ... }; return my; })( myModule || {} );

上述代码还存在一个问题,那就是如果a.js中声明了var myModule = …,b.js中也声明了var myModule = …,这样在引入a.js和b.js时,后者会将前者覆盖,这并不是我们期望的,所以对上述代码,可以再加改进:

(function ( my ) { my.xxMethod = function () { ... } })( window.myModule = window.myModule || {} );

上面把JavaScript模块化开发的基础知识作了介绍,接下来,会进一步介绍常见的规范和针对这些规范的一些js库实现,通过这些js库,我们可以很好的将模块化开发赋予实施。

转载于:https://my.oschina.net/yonguil/blog/390420

JavaScript模块化开发(一)基础知识相关推荐

  1. 前端开发之基础知识-HTML(一)

    1.1 html概述和基本结构 html概述 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制作网 ...

  2. day29—JavaScript中DOM的基础知识应用

    转行学开发,代码100天--2018-04-14 JavaScript中DOM操作基础知识即对DOM元素进行增删改操作.主要表现与HTML元素的操作,以及对CSS样式的操作.其主要应用知识如下图: 通 ...

  3. JavaScript模块化开发的演进历程

    写在前面的话 js模块化历程记录了js模块化思想的诞生与变迁 历史不是过去,历史正在上演,一切终究都会成为历史 拥抱变化,面向未来 延伸阅读 - JavaScript诞生(这也解释了JS为何一开始没有 ...

  4. 移动web开发入门—基础知识、自适应布局、调试

    之前没做过移动端web开发,最近接手的一个小项目是做微信公众号,需要考虑手机适配.UI给出的设计稿是一般是基于iphone手机做的(15年之后是基于ipone6),我们的UI是基于iphone6来做的 ...

  5. JavaScript模块化开发整理

    在网上已经有很多关于模块化开发的文章了,这里还是按照自己的理解来整理一下. 随着项目文件的越来越大和需求的越来越贴近现实(我发现现在客户不如:一个领导说我要审批你们报上来的资料,系统发布以后用的还不错 ...

  6. Android camera(4)---Android Camera开发之基础知识篇

    Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...

  7. 高通骁龙410C开发板基础知识

    高通骁龙410C开发板基础知识 高通骁龙410C开发板是基于高通400系列处理器的第一块开发板,性能优异,方便调试.它包含先进的电源管理,WIFI 蓝牙,GPS等等,所有都集成在一张信用卡大小的PCB ...

  8. 音视频开发入门基础知识(视频入门篇)

    RTSP实时音视频开发实战课程:<RTSP实时音视频开发实战> 音视频开发入门基础知识(音频入门篇) 目录 一.前言 二.视频采集和显示 三.视频常见的格式 四.RGB转YUV和YUV转R ...

  9. NT内核和驱动开发的基础知识-笔记

    这是我在学习NT内核和驱动开发的基础知识时记录的一些笔记,不是连续的教程,欢迎指正错误的地方 ----------------------------------------------------- ...

最新文章

  1. IP地址与字符串、整型之间的转换
  2. 【Android 应用开发】LruCache 简介
  3. BS作业 基于springboot + Thymeleaf +mybatis 实现的书城管理系统
  4. 监听浏览器是否被缩放 - 案例篇
  5. Vue中数组变动监听
  6. 分布式任务调度平台XXL-JOB一
  7. 安装双系统(ubantu和window10)失败后,如何找回数据及格式化被加密的U盘
  8. 文本匹配工具正式开源
  9. mysql批量入库values限制_mysql批量插入数据方法
  10. 神经网络二分类输出概率,神经网络二分类预测
  11. java 解析unicode,解析Unicode编码和Java char
  12. 中国第一政经博客 数学
  13. 斯坦福 计算机音乐 访问学者,韩宝强
  14. 合并多个集合同类项{aaa,bbb,ccc},{bbb,ddd},{eee,fff},{ggg},{ddd,hhh}通过编程实现结果为:{aaa,bbb,ccc,ddd,hhh},{eee,fff},
  15. 淮师计算机网络题库,淮阴师范学院(淮师)计算机基础一至六章习题
  16. Auto.js通知栏
  17. 微信小程序学习(三):在微信开发者工具中,使用WeUI前端美化框架,微信小程序
  18. 防火墙的基础配置(一)
  19. app闪退之-- GL error: Out of memory!
  20. OPPOEncoFree2配对

热门文章

  1. XE7 Unit scope names
  2. JS设置Cookie,及COOKIE的限制
  3. UVALive - 3641 Leonardo's Notebook(polya计数)
  4. ArcGIS API for Silverlight 入门学习笔记(一)hello world 补充问题
  5. 转载:面向站长和网站管理员的Web缓存加速指南
  6. 取得人生成功的40条定律
  7. ROS安装时rosdep init与rosdep update问题解决方法(2022.04.08亲测)
  8. python下列数据中不属于字符串的是_下列数据中,不属于字符串的是( )。 (6.0分)_学小易找答案...
  9. 局域网即时通讯软件java_如何选择企业即时通讯软件?
  10. java 获取字符串_详解Java String字符串获取每一个字符及常用方法