JavaScript结构三层——思想快速入门
本文版权归博客园和作者吴双本人所有,转载和爬虫请注明原文地址 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。
下面要讨论的这种方式,一定是基于上述代码整洁之道的基础之上。开篇的三个常用JS代码情形,你想到办法如何将他们分离解耦,如何处理好他们之间的关系了吗?
比方说,你在做一个互联网新闻网站。
对于这样的一个新闻列表,你可能需要Ajax对数据做增删改查操作,你也需要从后台读取数据并且渲染到页面,你也需要为页面上的一系列按钮或者什么控件注册一系列的操作事件。
这简单啊,这有什么难的!但是当你页面中新闻数据仅仅是一个小模块的时候,其他模块可能还有用户信息模块,评论模块,点赞模块,各种分类模块,广告招商模块,各种热门模块。如果想象不到复杂性,可以去网易新闻官网看看。
当然在这样的情况下,你可能说,分离js呀,js模块化,js合并压缩。是的,这些都是不错的解决方案。但是,你如何保证一个单独的JS或者模块化后的JS依然保持慢条斯理,结构清晰?或者说如果这些代码真的要写在一个JS里,如何写,如何维护。
有的老司机可能说,你不会是随便来谈谈MVVM吧?不是。在数据请求,数据渲染,事件注册这三种情形,在复杂的业务逻辑之下,我们要做的就是解耦分离。下面是我个人的解决方案,是我在不断的实践和尝试过程当中,感到受用,好用,一直在用的一种方案:
将上述三种代码分层,一个JS对象就是一“层”。每个业务点基本都分为这三层。
上面就算是伪代码吧。你可以看到我将js分为三层,操作,数据,渲染。你也可以看到,我们可以告别全局变量,和数据相关的全局变量,你将其存在相应的Data层下。业务相关的全局变量,你将它存在操作层下。渲染拼接工作就交给render来做,我通常渲染工作为了达到再度分离js html,我使用jquery.tmpl.js。你所有新闻相关的数据操作都应该放在newData层下,你所有操作事件应该写在newsOption层下。当你来了第二个业务点时,比如评论模块,那你就需要一套新的分层:commentOption,commentData,commentRender.
可能看完你想打我,我看了这么半天你就分享这点东西?但是相信我,这样的分层,对你自己而言赏心悦目,维护方便,开发快捷,调试容易。对他人而言,别人不会在背后骂你的代码咯。
JavaScript结构三层——思想快速入门的更多相关文章
- JavaScript结构三层——思想快速介绍
本文版权归博客园和作者吴双本人所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/,我是博客园蜗牛,我们共同进步. 今天讨论的是什么 如果你的工作中需要写JavaS ...
- JavaScript学习02(js快速入门)
快速入门 基本语法 JavaScript的语法和Java的语法类似,每个语句以;结束,语句块用{...}.但是JavaScrip并不强制要求在每个语句的结尾加;,浏览器中负责执行JavaScript代 ...
- vue 快速入门 系列 —— Vue(自身) 项目结构
其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...
- html5快速入门(四)—— JavaScript
前言: 1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真 ...
- JavaScript快速入门(四)——JavaScript函数
函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)——JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...
- JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署
接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...
- IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端
IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端 原文:http://docs.identityserver.io/en/release/quicks ...
- 【JavaScript】快速入门
摘抄地址快速入门 No1: JavaScript严格区分大小写 No2: JavaScript不区分整数和浮点数,统一用Number表示 NaN表示Not a Number,当无法计算结果时用NaN表 ...
- SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解
SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...
随机推荐
- 方便!C++ builder快捷键大全
Clipboard control (default) Ctrl+Ins Edit|Copy Shift+Del Edit|Cut Shift+Ins Edit|Paste Ctrl+C Edit|C ...
- 原创:Eclipse 上网代理设置(亲测有效)
直接上图:
- MysqlHelper 需要重写
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;u ...
- 关于oracle with as用法
with as语法–针对一个别名with tmp as (select * from tb_name) –针对多个别名with tmp as (select * from tb_name), ...
- bytes和bytearray
bytes bytes是Python 3中特有的,Python 2 里不区分bytes和str. Python 2中 >>> type(b'xxxxx') <type 'str ...
- UNR #1 题解
A. 争夺圣杯 还是想说一下,这题是原题啊...想做的人可以戳codechef上的MTMXSUM(懒得贴链接了,套了个壳,不过正常人应该都能看得出来) 显然异或输出没什么奇怪的性质... 考虑一个元素 ...
- 树莓派B+安装archlinux arm版
按Archlinux官网操作而来,如有疑问参照官网:http://archlinuxarm.org/platforms/armv6/raspberry-pi 以我自己安装过程举例,我的SD卡挂载在ub ...
- SQL Server之游标的基础知识
什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然 ...
- 您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧
转载至: http://www.cnblogs.com/Imaigne/p/4153397.html 您的项目引用了最新实体框架:但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mys ...
- noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20
T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= ...