读《编写可维护的JavaScript》第六章总结
第六章 避免使用全局变量
JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一。“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文。
在浏览器中,windows对象往往重载并等同于全局对象,因此任何在全局作用域声明的变量和函数都是windows对象的属性。
6.1 全局变量带来的问题
这个就不用照着书详谈了,当我们进入团队合作编写代码时,若大家自定义的变量都是直接挂载在windows对象上(也就是全局变量),很容易发生命名冲突。像这样:
function sayColor() {
alert(color); // 不好的做法: color是从哪来的?
}
so, 尽量避免定义全局变量
如果这样写函数,也是有问题的,这是一个依赖于全局变量的函数。如果环境发生变化,函数很可能就失效了。
如果color被当做参数传入,代码可维护性会变得更佳。
function sayColor(color) {
alert(color);
}
so, 定义函数的时候,最好尽可能多的将数据置于局部作用域内,在函数内定义的任何“东西”都应当采用这种做法,任何来自函数外部的数据都应当以参数的形式传进来。
6.2 意外的全局变量
JS有个特性大家应该都懂: 就是没有使用var声明的变量会被当做全局变量。
这个特性导致了有些人用一个单var语句声明俩个变量,结果在第一个变量后不小心敲了分号而不是逗号从而把第二个变量自动创建成了全局变量。(不过我的IDE都提示了)
function doSomething() {
var count = 10;
title = "Maintainable JavaScript"; // 不好的写法:创建了全局变量
}
so, 这个问题解决的方法有很多,依靠现代的许多智能IDE(如:WebStorm之类的)或者JSLine和JSHint工具也可以检查出来并警告,或者直接将代码采用严格模式。
"use strict";
foo = 10; // 引用错误: foo未被定义
6.3 单全局变量方式
为了解决前面的问题,最佳的办法就是依赖尽可能少的全局变量,即只创建一个全局变量。
单全局变量模式已经在各种流行的JavaScript类库中广泛使用了。
- YUI定义了唯一一个YUI全局对象。
- jQuery定义了俩个全局对象,$和jQuery。只有在$被其他的类库使用了的情况下:为了避免冲突,应当使用jQuery。
- Dojo定义了一个dojo全局对象。
“单全局变量”的意思是所创建的这个唯一全局对象名是独一无二的(不会和内置的API产生冲突),并将你所有的功能代码都挂载到这个全局对象上。
因此每个可能的全局变量都成为你唯一全局变量的属性。从而不会创建多个全局变量。
// 这段代码创建了4个全局对象:Book、Chapter1、Chapter2和Chapter3.
function Book(title) {
this.title = title;
this.page = 1;
}
Book.prototype.turnPage = function(direction) {
this.page += direction;
}
var Chapter1 = new Book("Introduction to Style Guidelines");
var Chapter2 = new Book("Bssic Formatting");
var Chapter3 = new Book("Comments");
单全局变量则只会创建一个全局对象并将这些对象都赋值为它的属性。
var MaintainableJS = {}; MaintainableJS.Book = function(title) {
this.title = title;
this.page = 1;
} MaintainableJS.Book.prototype.turnPage = function(direction) {
this.page += direction;
}
MaintainableJS.Chapter1 = new MaintainableJS.Book("Introduction ti Style Guidelines");
MaintainableJS.Chapter2 = new MaintainableJS.Book("Basic Formatting");
MaintainableJS.Chapter3 = new MaintainableJS.Book("Comments");
这段代码已有一个全局对象,即 MaintainableJS, 其他任何信息都挂载到这个对象上。因为团队中的每个人都知道这个全局对象,因此很容易做到继续为它添加属性以避免全局污染。
作者还介绍了关于命名空间(namespace)和模块(modules)的概念。
命名空间我这里就不说了。。因为这个概念就是很老的YUI框架运用的概念。现在的框架大多数是模块化的,所以我重点做模块的总结。
6.3.2 模块
模块这一节包含了大量我听过但不没有去弄懂的知识。
首先介绍模块:另外一种基于单全局变量的扩充方法是使用模块,模块是一种通用的功能片段,他并没用创建新的全局变量或命名空间。
相反,所有的这些代码都存放于一个表示执行一个任务或发布一个接口的单函数中。可以用一个名称来表示这个模块,同样这个模块可以依赖其他模块。
因为JavaScript本身不包含正式的模块概念,自然也没有模块语法(期待ECMAScript6), 目前,世界上,有两种比较流行的 JavaScript 模块化体系,
一个是 Node 实现的 CommonJS,另外一个是 AMD。
对于这俩者:了解他们也算是了解前端的历史了。。我在这里只将 看过的大神的解释 抛出,因为这确实不是一篇帖子就能说明的。
首先是了解CMD,它是前端界的名人玉伯在写完SeaJS后的推广过程中对模块定义的规范化产出。(这是一种思想- -SeaJS已经没落了)
接下来是AMD,它是 RequireJS 在推广过程中对模块定义的规范化产出。
他本人在知乎上的回答就概括了俩个规范:点这里
另一个是前端界的名人阮一峰对这俩个规范的解释:点这里
6.4 零全局变量
完全独立的脚本才会用到这种情形(注意:完全无依赖)。
(function() { "use strict"; var doc = win.document; // 在这里定义其他的变量
// 其他相关代码 }(Window));
读《编写可维护的JavaScript》第六章总结的更多相关文章
- 读《编写可维护的JavaScript》第一章总结
第一章 基本的格式化 1.4 ① 换行 当一行长度到达了单行最大的字符限制时,就需要手动将一行拆成俩行.通常我们会在运算符后换行,下一行会增加俩个层级的缩进. // 好的做法: 在运算符后换行,第二行 ...
- [已读]编写可维护的javascript
13年4月份出版,作者是大名鼎鼎的Zakas,他的另两本书<javascript高级程序设计>与<高性能javascript>你一定听过或者读过. 这本书重点讲了编码风格和编码 ...
- 【读书笔记】读《编写可维护的JavaScript》 - 编程实践(第二部分)
本书的第二个部分总结了有关编程实践相关的内容,每一个章节都非常不错,捡取了其中5个章节的内容.对大家组织高维护性的代码具有辅导作用. 5个章节如下—— 一.UI层的松耦合 二.避免使用全局变量 三.事 ...
- 拯救一切强迫症 - 读《编写可维护的 JavaScript》(一)
拯救一切强迫症 - 读<编写可维护的 JavaScript>(一) 本文写于 2020 年 4 月 24 日 我在小学的时候就有接触过编程,所以读大一的时候 C 语言还算是轻车熟路.自然会 ...
- 《编写可维护的javascript》读书笔记(上)
最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. ...
- 编写可维护的JavaScript 收纳架
如果你看过Nicolas C.Zakas写过的任何作品,你必须承认他是个不折不扣的天才.也只有天才级的才能写出<JavaScript高级程序设计>让所有的前端攻城师人手一本.Nicolas ...
- 推荐一本好书:编写可维护的JavaScript(可下载)
目录 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 下载: 有些建议: 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 很多设计模式就是为了解决紧耦合的问题.如果 ...
- 《编写可维护的JavaScript》之编程实践
最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...
- 编写可维护的Javascript读书笔记
写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...
- 《编写可维护的javascript》读书笔记(中)——编程实践
上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...
随机推荐
- (转载)Resin安装配置及使用教程
Resin是一个提供高性能的,支持 Java/PHP 的应用服务器.目前有两个版本:一个是GPL下的开源版本,提供给一些爱好者.开发人员和低流量网站使用:一种是收费的专业版本,增加了一些更加适用于生产 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架钜献 V3.0 版本强势发布
继上个版本“RDIFramework.NET V2.9版本”的推出,受到了重多客户的认可与选择,V2.9版本是非常成功与稳定的版本,感谢大家的认可与长期以来的关注与支持.V3.0版本在V2.9版本的基 ...
- [Core] .NET Core & VS Code 之路(2) Web API
开发Core项目的条件 Visual Studio 2015 Update 3 .NET Core 1.0.0 - VS 2015 Tooling Preview 2 看到VS包的体积,以及不想往下走 ...
- SublimeText的奇特应用
1.ctrl+shift+D:选中文本,粘贴复制 2.ctrl+D:批量选择文本 3.zen-coding:Tab键
- 关于针对class自定义new操作符失败的函数处理
#include <iostream> #include <new> using namespace std; class CSaveCurHandler //用于管理new_ ...
- React 入门实例教程(转载)
本人转载自: React 入门实例教程
- c#-快速排序-算法
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 步骤为: 1.从数列中挑出一个元素,称为 "基准"(p ...
- Excel应该这么玩——6、链接:瞬间转移
上一篇中提到通过命名表格来管理基础数据,这样会让数据更规范.如果有很多个基础数据表,需要查找或者修改其中的一个,可以通过名称框中下拉来定位. 但是当表格较多的时候,通过下拉选择的方式就不是很好定位了. ...
- PHP 生成验证码
//加载 vendor目录的phpqrcode.类文件 $a = vendor("phpqrcode.qrlib");// 创建目录 echo mkdir(__ROOT__.'/U ...
- 剖析javascript全局变量和局部变量
首先要记住: javascript是弱类型语言,它只有一种变量类型(var),为变量赋值时会自动判断类型并进行转换. 全局变量和局部变量如何声明? 全局变量声明: 第一种方式(函数外) var a; ...