js--编写可维护的JavaScript-2.编程实践

本文探讨了JavaScript编程中的最佳实践,包括分离关注点如将CSS、HTML和JavaScript分别处理,避免使用全局变量,合理处理事件,以及如何提高代码的可维护性和可测试性。

阅读编写可维护的JavaScript一书,写了一些笔记
1.编程风格
http://blog.youkuaiyun.com/github_34514750/article/details/51146963
2.本篇文章:编程实践

第五章:UI层的松耦合

将css从JavaScript中抽离
js改变样式常会直接修改DOM元素的style属性,但是其实样式最好尽可能的保持在CSS中,最好操作CSS的className

// 不好的写法
element.style.color = "red";
// 好的写法-原生方法
element.className += "reveal";
// 好得写法-HTML5
element.classList.add("reveal");
// 好得写法-jQuery
$(element).addClass("reveal");
//css中
.reveal{
    color:red;
}

将JavaScript从HTML中抽离
尽量不要在HTML中绑定on事件
将HTML从JavaScript中抽离

第六章:避免使用全局变量

全局变量带来的问题
命名冲突
代码的脆弱性(依赖全局变量的函数深耦合于上下文环境,一旦环境改变,可能发生问题)
难以测试(依赖于很多全局变量,没办法进行模块测试)
单全局变量方式
eg:jQuery定义了两个全局对象,$和jQuery,只有当$被其他库使用,才用jQuery
命名空间
命名空间:通过全局对象的单一属性表示的功能性分组
js我们就可以通过使用对象创建自己的命名空间

var books = {};
// a书的命名空间
books.a = {};
// b书的命名空间
books.b = {};

零全局变量
这种场景应用于完全不被其他脚本访问到的完全独立的脚本–实现方法就是:用立即执行函数调用并将所有脚本放置其中

// 这段立即执行的代码传入了window对象,因此不需要直接引用任何全局变量
// 若不修改window或doc中变量且都用var定义关键字,则不会产生任何全局变量
(function(win){
     // 设置严格模式来避免创建全局变量,当然全体是浏览器支持严格模式
     "use strict"
    var doc = win.document;
    // 其他变量和其他相关代码
}(window));
第七章:事件处理

事件触发时,event对象会作为回调参数传入事件处理程序
典型用法

// 这段代码问题:
// 事件处理程序包含了应用逻辑,应用逻辑是和应用相关的功能性代码,和用户行为无关
function handleClick(event) {
    var popup = document.getElementById("popup");
    popup.style.left = event.clientX + "px";
    popup.style.top = event.clientY + "px";
    popup.className = "reveal";
}

addListener(element,"click",handleClick);

应用抽离的好处
将此逻辑抽离出来,因为说不定用户的其他行为可能希望触发同一段逻辑(比如用户在键盘中敲入了什么,或者鼠标移到了什么地方)
即同段代码不用于耦某个特定事件的触发

应用逻辑抽离
1.将应用逻辑放在单独的一个函数中
2.并且这个函数很有可能挂载在该应用定义的一个全局对象上

var MyApplication = {
    handleClick:function(event) {
        this.showPopup(event);
    }
    // 好得api对于期望和依赖是透明的,但是这里却用event,不告诉用哪些参数
    // 测试起来不方便,还需要重新创建一个event对象才可以有参数传入
    showPopup:function(event) {
        var popup = document.getElementById("popup");
        popup.style.left = event.clientX + "px";
        popup.style.top = event.clientY + "px";
        popup.className = "reveal";
    }
};


addListener(element,"click",function(event) {
    MyApplication.handleClick(event);
});

不要分发事件对象
上述代码中event对象被无节制的分发,处理函数–>MyApplication.handleClick–>MyApplication.showPopup()

var MyApplication = {
    // 最好让事件处理程序作为接触到event对象的唯一函数
    handleClick:function(event) {
        this.showPopup(event.clientX,event.clientY);
    }
    // 好得api对于期望和依赖是透明的,这里就透明
    // 测试起来方便,给出任意x,y即可
    showPopup:function(x,y) {
        var popup = document.getElementById("popup");
        popup.style.left = x + "px";
        popup.style.top = y + "px";
        popup.className = "reveal";
    }
};


addListener(element,"click",function(event) {
    MyApplication.handleClick(event);
});
// 很好的调用,测试也方便
MyApplication.showPopup(10,10);

进入应用逻辑之前针对event对象执行必要的操作(包含阻止默认事件和阻止事件冒泡)

var MyApplication = {

    handleClick:function(event) {
        // 假设时间支持DOM level2,阻止默认和冒泡
        event.preventDefault();
        event.stopPropagation();
        this.showPopup(event.clientX,event.clientY);
    }
    showPopup:function(x,y) {
        var popup = document.getElementById("popup");
        popup.style.left = x + "px";
        popup.style.top = y + "px";
        popup.className = "reveal";
    }
};


addListener(element,"click",function(event) {
    MyApplication.handleClick(event);
});
第八章:避免空比较
编写可维护JavaScript》向开发人员阐述了如何在团队开发中编写具备高可维护性的JavaScript代码,书中详细说明了作为团队一分子,应该怎么写JavaScript。本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。   《编写可维护JavaScript》作者Nicholas C. Zakas是顶级的Web技术专家,也是《JavaScript高级程序设计》一书的作者。他曾是Yahoo!的首席前端开发工程师,在完成了从一名“独行侠”到“团队精英”的蜕变后,他站在前端工程师的角度提炼出众多的最佳编程实践,其中包括很多业内权威所推崇的最佳法则,而这些宝贵经验正是本书的核心内容。   《编写可维护JavaScript》适合前端开发工程师、JavaScript程序员和学习JavaScript编程的读者阅读,也适合开发团队负责人、项目负责人阅读。运用本书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 第一部分 编程风格 第1章 基本的格式化 1.1 缩进层级 1.2 语句结尾 1.3 行的长度 1.4 换行 1.5 空行 1.6 命名 1.6.1 变量和函数 1.6.2 常量 1.6.3 构造函数 1.7 直接量 1.7.1 字符串 1.7.2 数字 1.7.3 null 1.7.4 undefined 1.7.5 对象直接量 1.7.6 数组直接量 第2章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.3.1 难于理解的代码 2.3.2 可能被误认为错误的代码 2.3.3 浏览器特性hack 2.4 文档注释 第3章 语句和表达式 3.1 花括号的对齐方式 3.2 块语句间隔 3.3 switch语句 3.3.1 缩进 3.3.2 case语句的“连续执行” 3.3.3 default 3.4 with语句 3.5 for循环 3.6 for-in循环 第4章 变量、函数和运算符 4.1 变量声明 4.2 函数声明 4.3 函数调用间隔 4.4 立即调用的函数 4.5 严格模式 4.6 相等 4.6.1 eval() 4.6.2 原始包装类型 第二部分 编程实践 第5章 UI层的松耦合 5.1 什么是松耦合 5.2 将JavaScript从CSS中抽离 5.3 将CSS从JavaScript中抽离 5.4 将JavaScript从HTML中抽离 5.5 将HTML从JavaScript中抽离 5.5.1 方法1:从服务器加载 5.5.2 方法2:简单客户端模板 5.5.3 方法3:复杂客户端模板 第6章 避免使用全局变量 6.1 全局变量带来的问题 6.1.1 命名冲突 6.1.2 代码的脆弱性 6.1.3 难以测试 6.2 意外的全局变量 避免意外的全局变量 6.3 单全局变量方式 6.3.1 命名空间 6.3.2 模块 6.4 零全局变量 第7章 事件处理 7.1 典型用法 7.2 规则1:隔离应用逻辑 7.3 规则2:不要分发事件对象 第8章 避免“空比较” 8.1 检测原始值 8.2 检测引用值 8.2.1 检测函数 8.2.2 检测数组 8.3 检测属性 第9章 将配置数据从代码中分离出来 9.1 什么是配置数据 9.2 抽离配置数据 9.3 保存配置数据 第10章 抛出自定义错误 10.1 错误的本质 10.2 在JavaScript中抛出错误 10.3 抛出错误的好处 10.4 何时抛出错误 10.5 try-catch语句 10.6 错误类型 第11章 不是你的对象不要动 11.1 什么是你的 11.2 原则 11.2.1 不覆盖方法 11.2.2 不新增方法 11.2.3 不删除方法 11.3 更好的途径 11.3.1 基于对象的继承 11.3.2 基于类型的继承 11.3.3 门面模式 11.4 关于Polyfill的注解 11.5 阻止修改 第12章 浏览器嗅探 12.1 User-Agent检测 12.2 特性检测 12.3 避免特性推断 12.4 避免浏览器推断 12.5 应当如何取舍 第三部分 自动化 第13章 文件和目录结构 13.1 最佳实践 13.2 基本结构 第14章 Ant 14.1 安装 14.2 配置文件 14.3 执行构建 14.4 目标操作的依赖 14.5 属性 14.6 Buildr项目 第15章 校验 15.1 查找文件 15.2 任务 15.3 增强的目标操作 15.4 其他方面的改进 15.5 Buildr任务 第16章 文件合并和加工 16.1 任务 16.2 行尾结束符 16.3 文件头和文件尾 16.4 加工文件 第17章 文件精简和压缩 17.1 文件精简 17.1.1 使用YUI Compressor精简代码 17.1.2 用Closure Compiler精简 17.1.3 使用UglifyJS精简 17.2 压缩 17.2.1 运行时压缩 17.2.2 构建时压缩 第18章 文档化 18.1 JSDoc Toolkit 18.2 YUI Doc 第19章 自动化测试 19.1 YUI Test Selenium引擎 19.1.1 配置一台Selenium服务器 19.1.2 配置YUI Test Selenium引擎 19.1.3 使用YUI Test Selenium引擎 19.1.4 Ant的配置写法 19.2 Yeti 19.3 PhantomJS 19.3.1 安装及使用 19.3.2 Ant的配置写法 19.4 JsTestDriver 19.4.1 安装及使用 19.4.2 Ant的配置写法 第20章 组装到一起 20.1 被忽略的细节 20.2 编制打包计划 20.2.1 开发版本的构建 20.2.2 集成版本的构建 20.2.3 发布版本的构建 20.3 使用CI系统 20.3.1 Jenkins 20.3.2 其他CI系统 附录A JavaScript编码风格指南 附录B JavaScript工具集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值