本文版权归博客园和作者吴双本人所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/,我是博客园蜗牛,我们共同进步。

今天讨论的是什么

如果你的工作中需要写JavaScript,而你的JavaScript代码又与业务相关。我想无非就是一下三类功能:

1.请求后台数据

2.渲染后台数据,拼接Html

3.事件操作

当然你如果封装JS底层的控件,不在我们今天的讨论范围。你也许写过单文件上千行的JS,你也许维护过几千行的JS,每次重新看起来,或者增删改功能吃力吗,如果你说不吃力,那这篇文章不适合你,如果有些吃力,我们一起来探讨今天的话题。今天要讨论的是,当你需要写如上三种JS代码时,你如何处理他们之间的关系?

提醒:如果你还不懂JS对象或者简单的封装,请移步我的这两篇分享:

1.JavaScript 闭包   http://www.cnblogs.com/tdws/p/5944254.html

2. JavaScript OOP http://www.cnblogs.com/tdws/p/5947693.html

代码整洁之道

仅仅是整洁的代码真的有用吗?

我想说整洁的代码只是一部分。这个整洁所包含的,我认为是:

1.一个方法只做一件事情,一个方法的行数一定要对自己做严格要求,多余的事情,另起一个方法,并配有合适的命名。

举个例子来说,我在ajax请求都数据,回调方法可能需要对返回结果做一定的逻辑处理,拼接处理。在这个时候,我是很反对直接在回调方法中写一长串处理逻辑的,一定要用一个新的function来处理。

2.坚决杜绝全局变量。

有的人可能认为,如果我注意点,全局变量并不会带来什么坏的影响。这样说没毛病,但是全局变量带来的难以阅读和难以维护性是不可估量的。

3.绝不在页面底部或者$(function(){});或者onload中直接以$(xxx).click(function(){});这种形式来注册事件。也绝不在html拼接成功后的方法中以上述方式注册事件。

个人推崇的方式是,一定要将事件注册封装成方法。然后再去调用方法。

其余的整洁规范不做赘述,代码整洁这种东西,要在不断的实践中,用心去思考和体会,并且亲手优化和修改,只有一套理论摆着这里,收获是0。

JavaScript代码分"层"

下面要讨论的这种方式,一定是基于上述代码整洁之道的基础之上。开篇的三个常用JS代码情形,你想到办法如何将他们分离解耦,如何处理好他们之间的关系了吗?

比方说,你在做一个互联网新闻网站。

对于这样的一个新闻列表,你可能需要Ajax对数据做增删改查操作,你也需要从后台读取数据并且渲染到页面,你也需要为页面上的一系列按钮或者什么控件注册一系列的操作事件。

这简单啊,这有什么难的!但是当你页面中新闻数据仅仅是一个小模块的时候,其他模块可能还有用户信息模块,评论模块,点赞模块,各种分类模块,广告招商模块,各种热门模块。如果想象不到复杂性,可以去网易新闻官网看看。

当然在这样的情况下,你可能说,分离js呀,js模块化,js合并压缩。是的,这些都是不错的解决方案。但是,你如何保证一个单独的JS或者模块化后的JS依然保持慢条斯理,结构清晰?或者说如果这些代码真的要写在一个JS里,如何写,如何维护。

有的老司机可能说,你不会是随便来谈谈MVVM吧?不是。在数据请求,数据渲染,事件注册这三种情形,在复杂的业务逻辑之下,我们要做的就是解耦分离。下面是我个人的解决方案,是我在不断的实践和尝试过程当中,感到受用,好用,一直在用的一种方案:

将上述三种代码分层,一个JS对象就是一“层”。每个业务点基本都分为这三层。

 
最后的阐述

上面就算是伪代码吧。你可以看到我将js分为三层,操作,数据,渲染。你也可以看到,我们可以告别全局变量,和数据相关的全局变量,你将其存在相应的Data层下。业务相关的全局变量,你将它存在操作层下。渲染拼接工作就交给render来做,我通常渲染工作为了达到再度分离js html,我使用jquery.tmpl.js。你所有新闻相关的数据操作都应该放在newData层下,你所有操作事件应该写在newsOption层下。当你来了第二个业务点时,比如评论模块,那你就需要一套新的分层:commentOption,commentData,commentRender.

可能看完你想打我,我看了这么半天你就分享这点东西?但是相信我,这样的分层,对你自己而言赏心悦目,维护方便,开发快捷,调试容易。对他人而言,别人不会在背后骂你的代码咯。

JavaScript结构三层——思想快速入门的更多相关文章

  1. JavaScript结构三层——思想快速介绍

    本文版权归博客园和作者吴双本人所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/,我是博客园蜗牛,我们共同进步. 今天讨论的是什么 如果你的工作中需要写JavaS ...

  2. JavaScript学习02(js快速入门)

    快速入门 基本语法 JavaScript的语法和Java的语法类似,每个语句以;结束,语句块用{...}.但是JavaScrip并不强制要求在每个语句的结尾加;,浏览器中负责执行JavaScript代 ...

  3. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  4. html5快速入门(四)—— JavaScript

    前言: 1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真 ...

  5. JavaScript快速入门(四)——JavaScript函数

    函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)——JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...

  6. JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

  7. IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端

    IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端 原文:http://docs.identityserver.io/en/release/quicks ...

  8. 【JavaScript】快速入门

    摘抄地址快速入门 No1: JavaScript严格区分大小写 No2: JavaScript不区分整数和浮点数,统一用Number表示 NaN表示Not a Number,当无法计算结果时用NaN表 ...

  9. SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解

    SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...

随机推荐

  1. Windows系统Stunnel客户端的配置

    Stunnel官方就有Windows版本,到下面的地址下载: https://www.stunnel.org/downloads.html 选择”stunnel-X.XX-installer.exe“ ...

  2. JavaScript 全局属性/函数

    JavaScript 全局 JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示 ...

  3. .Net Core 控制台程序错误:Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'.

    .Net Core 控制台程序错误:Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible wi ...

  4. Java daemon thread 守护线程

    守护线程与普通线程写法上基本么啥区别,在启动线程前, 调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存 ...

  5. listview1

    Edit1.Text := listview1.Items[i].Caption; //读第i行第1列 Edit2.Text := listview1.Items[i].SubItems.string ...

  6. TP框架自带的正则验证的规则(转载)

    thinkphp框架里面自带有很多自动验证的规则,下面是框架自带的正则验证的规则,官方的说明文档里面没有这么多,所以记下来,以备使用. view sourceprint?01static $regex ...

  7. NodeJS 开篇 牛刀小试

    一.Node&NPM的安装与配置 下载:https://nodejs.org/en/ V4.2.x LTS(9.75MB)——长期支持版,成熟可靠 V5.x.x Stable(9.71MB)— ...

  8. 基于LeNet网络的中文验证码识别

    基于LeNet网络的中文验证码识别 由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013 ...

  9. CodeDom

    细说CodeDom 在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说, ...

  10. nfs 三个参数权限

    遇到nfs客户端不可写的情况.  有延迟啊啊啊..  等1min左右就可以写了. 挂载参数: cat /var/lib/nfs/etab -->server cat /proc/mounts   ...