造轮子和用轮子:快速入门JavaScript模块化

造轮子和用轮子:快速入门JavaScript模块化

时间 2016-03-16 21:59:39  SegmentFault

原文  https://segmentfault.com/a/1190000004619857

主题 JavaScript

前言

都说“不重复造轮子”,就像iPhone——它除了打电话还可以播放音乐——但是工程师不用从零开始做一个音乐播放功能,也许只要在iPhone的系统中整合一个ipod。

前端开发亦是如此,最理想化的开发状态就是,工程师只写核心业务代码,其他通用的功能和组件都可以无缝加载别人写好的代码,就像很多那样。

可是实际情况是,有个糟糕的 iPhone 工程师,他搞混了 iPhone 和 ipod 的系统,甚至把 iPhone 的 Home 键和 iPod 的音量键焊在同一个。

还有一些糟糕 JavaScript 开发者,一不小心声明了全局变量,混乱了“命名空间”,都让协作开发变得不那么友好,抑或他开发了一个通用模块,用户们却发现载入了他的代码之后,用户自己的代码被他搞得一团糟。

原始人写法

比如下面这段代码:

var mylove = "coding";

function getLove() {
  return mylove;
}

function sayLove(thing) {
  console.log(thing);
}

console.log(getLove());//>>> coding
sayLove(‘girl‘);//>>> girl

在 window 对象下声明了一个变量 mylove ,然后使用 getLove() 函数去获取这个变量,使用 setLove() 修改这个变量。

恩,功能是实现了。只是这样做之后,说不定什么时候你由于粗心又在某个地方声明了一次 mylove ,而你的粗心同事也不知道会在什么地方写了一个同名函数——也许有3个参数的 setLove() 函数。

对象封装写法

怎么办呢?你获取想到了,把这些变量和函数都写在一个对象里:

var loveThing = {
  mylove : "coding",
  getLove :function() {
    return this.mylove;
  },
  sayLove : function(thing) {
    console.log(thing);
  }
}

console.log(loveThing.getLove());//>>> coding
loveThing.sayLove(‘girl‘);//>>> girl

这种写法已经有点模块的样子了,一下就能看出这几个函数和变量之间的联系。缺点在于所有变量都必须声明为公有,所以都要加this指示作用域以引用这些变量。更危险的是,在对象之外也能轻松更改里面的参数:

loveThing.mylove = "sleeping";
console.log(loveThing.getLove());//>>> sleeping

立即执行函数

我向来不惮以最坏的恶意揣测程序员,你永远想不到你的 partner 会不会真的在其他地方修改了你的参数,也不知道自己是否会在不经意间修改了他的。我们必须在他下手之前——让自己的模块先执行掉,不给对方可趁之机。此时使用一种叫做 立即执行函数 的办法,可以避免暴露私有成员。

var loveThing = (function(){
  var my = {};
  var love = "coding";
  my.getLove = function() {
    return love;
  }
  my.sayLove = function(thing) {
    console.log(thing);
  }
  return my;
})();

console.log(loveThing.getLove());//>>> coding
loveThing.sayLove(‘reading‘);//>>> reading

我们试着获取里面的变量:

console.log(loveThing.love);//>>> undefined

果然,外部根本看不见里面的零件,只能使用提供的接口。这样才能保证私有变量的安全。

放大模式

当然,一个项目要用到模块化的时候,说明这个项目足够大足够复杂,一个模块可能需要继承另一个模块,或者扩充模块,这时候需要使用 放大模式 :

var loveThing = (function (o){
  o.sayOK = function () {
    console.log(‘OK‘);
  };
  return o;
})(loveThing);

loveThing.sayOK();//>>> OK!

宽放大模式

可是,浏览器是一个不按常理出牌的环境,你永远不知道自己引用的模块是否已经加载。万一我之前的 loveThing 没有被加载,上面这段代码就会报错了(找不到对象)。解决方法就是所谓 宽放大模式 :

var loveThing = (function (o){
  o.sayOK = function () {};
  return o;
})(loveThing || {});

与之前唯一的不同就是参数可以为空对象。

至此,最基本的JavaScript模块化写法你已经学会了,相信你也体会到自己原来的写法有什么不足。

受篇幅限制,本篇入门到此结束,我会在下一篇讨论流行的模块化规范。

时间: 2024-12-15 08:32:48

造轮子和用轮子:快速入门JavaScript模块化的相关文章

汇道科技:web新手快速入门JavaScript的技巧

我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前:有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候.找不到时间(有时是动力)学习.很容易忘记已经理解了的东西.工具多又在不断变化,所以不知道从哪里开始.幸运的是,这些拦路虎是可以被识别,并消灭的.在这篇文章中,汇道科技将介绍六个思维技巧来帮助你更快地学习JavaScript,并成为一个更快乐.更富有成效的程序员. 1.不要让未来的决策阻止你现在前进的方向 很多人学习JavaScript,问的第一个问题

前端零基础快速入门JavaScript

JavaScript代码可以直接嵌在网页的任何地方,不过通常我们都把JavaScript代码放到<head>中: <html><head> <script> alert('Hello, world'); </script></head><http://www.my516.com> ...</body></html> 1234567891011由<script>...</script

2014年辛星解读Javascript之DOM快速入门

在Javascript的知识中,有一个所谓的DOM,即文档对象模型,我们可以通过它来访问HTML文档的元素,当网页被加载的时候,浏览器会去创建DOM,有了这个DOM,我们可以使用Javascript去改变页面中HTML元素和属性,改变CSS样式,能够对页面中的事件作出响应. 首先就是查找一个HTML元素,我们可以通过三种方式来做到,即通过id.标签名和类名,通过id是使用getElementById方法,它是doucument的一个方法,通过标签名则可以使用getElementsByTagNam

【JavaScript】快速入门

摘抄地址快速入门 No1: JavaScript严格区分大小写 No2: JavaScript不区分整数和浮点数,统一用Number表示 NaN表示Not a Number,当无法计算结果时用NaN表示 Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity JavaScript允许对任意数据类型做比较 No3: 要特别注意相等运算符==.JavaScript在设计时,有两种比较运算符: 第一种是==比较,它会自动转换数据类型再比较

10 分钟,带你快速入门前端三大技术(HTML、CSS、JavaScript)

听到前端技术,不少朋友一定会感到有些陌生.但其实,前端,你每天都在接触. 你正在使用的APP,你正在浏览的网页,这些你能看到的界面,都属于前端. 而前端最重要的三大技术,HTML,CSS,JavaScript,则是每一个前端开发者必须具备的技能. 掌握这些技能,你可以快速地做出一个酷炫的APP界面或者一个简单大方的网站页面.因此,就让我们一起来快速学习一下这三门技术吧. 以下内容节选自课程<Vue.js 和 Node.js 构建内容发布系统>. 大家也可以点击课程链接,在实验楼提供的虚拟机环境

npm 与 package.json 快速入门教程

npm 与 package.json 快速入门教程 2017年08月02日 19:16:20 阅读数:33887 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧! 读完本文你将了解: 什么是 npm? 安装 npm 更新 npm package.json 文件 package.json 如何创建 package.json 的内容 指定依赖的包 Semantic versioning(语义化版本规则) 安装 pa

vue.js--60分钟快速入门

Vue.js--60分钟快速入门 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 本文摘自:http://www.cnblogs.com/keepfool/p/5619070.html 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM

22--Rails快速入门总结

Rails的快捷最主要归功于ruby语言的特性,这个快速入门始终是入门而已.想要学好rails还是需要打好ruby基础,不要rails的进阶那些,没有良好的ruby基础是学不好的. Rails涉及的coffeescript和scss都是基于javascript和css的,我们要先进一步熟悉javascript和css这样用起来就很方便了,因为这两个就是简单地修改了用法使得开发更加快捷而已. ?

Redis快速入门:初识Redis

[IT168 专稿]在之前的文章中介绍了<Redis快速入门:选择Key-Value Store>,今天给大家介绍Redis的入门知识.Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主持. 1.数据类型 作为Key-value型数据库,Redis也提供了键(Key)和键值(Value)的映射关系.但是,除了常规的数值或字符串,Redis的键值还