几点建议帮你写出简洁的JS代码-转自别人的博客

Ghost 基于 Node.js 构建的开源博客平台 介绍: Ghost 是一个开源的博客平台,  可以把他看作 WordPress 的一个挑战者. 现阶段的 WordPress 已经可以明显感觉到有些臃肿不堪, 无论是构架, 设计,  还是实现处处都显示出这是一个 10 年前就诞生的项目, 尤其是最近几个版本更新, 几乎都只是在功能和交互层面作出改进,  而看不到本质上的进步和优化. 因此我更愿意把 Ghost 看作 WordPress 的继任者. 同时, Ghost 基于 JavasSript 的 Node.js 进行开发, 阅读详情

总结

1.尽量少出现呢数字,多用常量代替
2.标签体内的标识符 比如我们可以使用data-*语法:
3.$.post
4.多元素事件
5.带命名空间的事件(namespaced events)


  1. 常量

这个问题哦不仅仅是写JavaScript的开发者们会遇到,在所有的开发语言中都要避免。我们来看一个例子:

$elem.on('keydown', function(e) {
if (e.keyCode == 27) {
//...
}
});
27到底代表什么?如果你经常编程,很容易知道这个数字代表ESC键。但是对大多数开发者,特别是初学者,他们要么记不住这些数字代号,要么根本就不知道。当在阅读源代码的时候,遇到这样的代码段,那么就需要花费时间去查找27和按键的对应关系。当然,你也可以在后边加上注释。不过,在这里我建议你使用一个常量名来代替,比如:KEY_ESC = 27。这样更加直观易懂!

  1. 标识符(identifiers)

我们经常需要获取某个元素(评论、博客、用户、等等)的标识符,然后做一些计算。比如:

var id = $(this).attr('id').substring(8);
正如我们已经提过,阅读这段代码的开发者需要去推测为什么用8。

我们再举一个例子(来自一个实际的项目):

var last_id = $('#answer_pid' + id + ' li:first div').attr('id').substr(7);
html的布局稍有变动,都将导致这部分代码出错。

我们再看一个:

<div class="comment" id="comment_123"></div>
var id = $(this).attr('id').substring("comment_".length);
这段代码好一点,至少没有使用看不懂的数字,但JavaScript代码还是和html有太多的绑定。

我们可以使用data-*语法:

<div class="comment" data-id="123"></div>
然后,用更加简洁的语法来获取属性值:

var id = $(this).attr('data-id');
或则:

var id = $(this).data('id');

  1. $.post

我们都知道jQuery有一个ajax函数$.ajax。对于具体的操作,还有$.get, $..load, $.post, 等等。这些函数被我们频繁的使用(上传一段脚本,json文件,执行一个post请求),它们底层都是用$.ajax实现。

对于个人而言,我从不使用这些简化版的函数,接下来我会告诉你为什么。

对于初学者或则经验不足的开发者,你会发现写代码也会分为不同的层次:

● a. 初级
$.post(url, data, function(data) {
data = $.parseJSON(data);
//...
});
● b. 考虑异常情况

$.post(url, data, function(data) {
try {
data = $.parseJSON(data);
} catch (e) {
return;
}
//...
});
● c. 如果认真阅读$.post的文档,我们就会发现最后一个参数应该是数据的类型dataType, 但是我发现在大多数开发者写的代码中都忘记了!

$.post(url, data, function(data) {
//...
}, 'json');
我发现初学者很少在项目开发中考虑错误处理,他们通常不愿意多花5分钟额外的时间去完善这部分工作,或则自信的认为代码不会有问题。

如果他们决定添加错误处理到$.post,通常会像下面这样写:

$.post(url, data, function(data) {
//...
}, 'json').error(function() {
//...
});
这样写是很难理解的!每次都去写出错处理非常的繁琐和耗时,你可以定义一个默认的错误处理句柄(default error handler)来应对所有的ajax请求。对于全局的异常,产品上线以后可以使用fundebug的JavaScript插件来抓取。

$.ajaxSetup({
error: function() {
// Error modal
}
});
我们回到$.post函数,上面的写法很难读懂,而且dataType作为最后一个参数很容易遗漏。我个人认为,如下的写法更加容易阅读和维护:

$.ajax({
type: "POST",
url: url,
data: data,
dataType: "json",
success: function(data) {
//...
},
error: function() {
//...
}
});

  1. 多元素事件

有时候,我们需要给页面元素绑定对应的事件(删除消息的按钮)。经常,我们会这样实现:

$('.comment a.delete').click(function(){
//...
});
问题在于,如果我们要把同一个事件绑定到一个新的元素(比如一个新载入的评论)。我浏览过很多解法,其中一个典型的解法是重新定义所有元素上的事件:

$('.comment a.delete').unbind('click').click(function() {
//
});
在jQuery 1.7中有on事件,可以把事件绑定到某个行为,并且可以通过选择器(selector)过滤元素:

$('body').on('click', 'a.external', function(e) {
// 该函数只会绑定到那些有external类的元素上
});
值得一提的是,上面的代码对于动态生成的对象也有效。应当大力提倡,不过也要小心!如下代码会导致效率的降低,拖慢浏览器的速度:

$('body').on('mousemove', selector, function() {
//...
});

  1. 带命名空间的事件(namespaced events)

带命名空间的事件(namespaced events)在jQuery 1.2就被加入了,但是没有几个人用。我敢打赌你也不知道!

举个例子:

$('a').on('click', function() {
// Handler 1
});
$('a').on('click', function() {
// Handler 2
});
如果我们想要移除第二个handler, 使用$(‘a’).off(‘click’)确会把两个handler都移除掉!

但是如果使用带命名空间的事件,就可以搞定:

$('a').on('click.namespace1', function() {
//Handler 1
});
$('a').on('click.namespace2', function() {
//Handler 2
});
使用如下代码移除:

$('a').off('click.namespace2');
如果想更多了解,请参考: Event names and namespaces(http://api.jquery.com/on/#event-names)

这还只是我在阅读别人代码的时候,经常遇到的问题中的一小部分。我希望这篇文章可以帮助大家提高写代码的质量!

转自:https://blog.fundebug.com/2017/07/12/tips_for_writing_cleaner_code/
作者:Fundebug

Markdown 转 HTML 库,推荐大家收藏 Markdown 转 HTML 是前端开发中不可或缺的技能,而选择合适的工具可以事半功倍。 阅读详情

相关推荐

Node.js博客系统构建实践指南

本文还有配套的精品资源,点击获取 简介:本项目是一个Node.js博客实践教程,涵盖了从搭建环境、理解Node.js特性、集成Express框架、使用EJS模板引擎到集成数据库等核心技能。开发者将学习如何构建一个具备用户认证、RESTful API设计和前端界面的完整博客系统。本教程还包括错误处理、日志记录、应用部署及CI/CD流程的知识,旨在全面提升Node.js Web...

weixin_42611177的博客 3087

js框架,为了不让使用者掌握核心代码,而进行代码混淆,让别人看不懂

https://www.zhihu.com/question/47047191

Ideality_hunter的专栏 648

用JavaScript实现交互式博客式日历功能

简介:本项目介绍了一个使用JavaScript开发的交互式日历组件,该组件具有类似博客网站的功能,允许用户通过网页进行日期选择和事件管理。开发者可能基于现有的基础模板或开源库进行定制化调整,并利用DOM操作和事件监听来实现用户交互。项目包括一个HTML文件,其中嵌入了JavaScript代码,并通过CSS样式和JavaScript逻辑来控制日历的显示与行为。源码文件的发布为其他开发者提供了学习和重用该组件的机会。

weixin_32869687的博客 945

代码要写成别人看不懂的样子(一)

本篇文章参考以下博文 文章目录前言 前言   最近读了一本书,张容铭老师的 《JavaScript设计模式》 ,书中提到的编码模式,编码风格,让我想起了我刚学 JS 的时候,特别向往像大神一样,全篇没什么 div 罗列,都是方法或者构造函数之类的东西,一顿操作后, body 里面只要添加一个 <div id=“demo”> ,大功告成。   逼格满满有没有,当时就想,什么时候我也能这样,别人看不懂我的代码,所有的事情不用自己手写,只要给一个容器,然后执行函数就

不见浅诗的博客 1713

Node.js博客系统开发详解

本文还有配套的精品资源,点击获取 简介:本文详细介绍了如何利用Node.js构建一个基础的博客系统,从项目结构的搭建到动态内容生成、页面跳转、用户认证与登录、数据库操作及文件上传功能的实现。文章通过逐步讲解,展示了使用Express框架简化Web应用开发的过程,包括模板引擎的使用、路由和中间件的配置、session管理以及与MongoDB数据库的集成。 1. No...

weixin_28968525的博客 1308

手把手教你用Matlab实现Copula函数:从理论到代码的完整指南

本文提供了一份在MATLAB中实现Copula函数的完整实战指南。从理解Sklar定理和常见Copula家族(如高斯、t、Clayton)的核心概念出发,详细讲解了数据预处理、边缘分布拟合、概率积分变换等关键步骤。通过具体代码示例,手把手演示了Copula模型的拟合、评估、蒙特卡洛模拟,并进阶应用于金融风险度量(如VaR计算)和条件分布分析,帮助读者掌握这一强大的多变量依赖建模工具。

y9z0a1b的博客 953

代码要写成别人看不懂的样子(二)

文章目录前言前期准备如何才能让别人看不懂1.四两拨千斤2.指桑骂槐 前言   上一期我们,浅尝辄止,稍微介绍了下代码如何写才能更高级,更有内涵,主要是需要配合继承,或是某些数据特性来说。这一节咱们放个大招,运用兵法来写代码,保证初学者看不懂,既便能看懂,也不知道为什么这样做,即便知道为什么这样做,没有系统学习过的人也做不好。   这部兵法就是–设计模式。 前期准备   各位乡绅,读这本书前,个人建议要对 继承 , 类 (虽然JS在ES6之前没有类,但是可以通过一些手段实现类), 构造函数 ,

不见浅诗的博客 623

cadence——MOS晶体管I-V特性曲线仿真

MOS晶体管I-V特性曲线仿真 目标:使用cadence绘制晶体管的I-V特性曲线(dc仿真) 流程: 新建原理图,将MOS管的栅极电压设为变量Vg,漏极电压设为变量Vd 打开ADEL,点击Variables——Copy From Cellview添加变量;并选择dc仿真,对Vd进行扫描 以Vg作为参变量进行仿真,点击Tools——Parametric Analysis进行设置 选择漏极电流作为输出,进行仿真即可得到I-V特性曲线 ...

skycmq的博客 1万+

几点建议帮你写出简洁的JS代码

我决定为初学者写一篇博客来介绍一些常见编程技巧,这些技巧可以帮助你写出更加规范,容易维护的代码。 1. 常量 这个问题哦不仅仅是写JavaScript的开发者们会遇到,在所有的开发语言中都要避免。我们来看一个例子: $elem.on('keydown', function(e) { if (e.keyCode == 27) { //... }});

心暖未晴 371

xsens IMU配置

1.安装驱动 sudo apt-get update sudo apt-get install ros-kinetic-xsens-driver 2.配置IMU 设置输出四元数,加速度、角速度、地磁 cd /opt/ros/kinetic/lib/xsens_driver python mtdevice.py --configure "oq,aa,wr,mf" 3.启动IMU roslaunch xsens_driver xsens_driver.launch 转(https://www.cnblo

qq_41585680的博客 2325

【Flink cdc】Data row is smaller than a column index, internal schema representation is probably xxx

翻译一下:当scan.startup.mode=EARLIEST_OFFSET时,如果在最早的offset之后表结构有过变化就无法支持。原因应该是在binlog 的earliest_offset之后,表结构被修改过。我的解决方案:source配置中使用。mysql source配置使用。,以时间戳为消费依据。

integrity 2085

新手学习Cesium的几点建议

初学者如何学习Cesium,本篇文章给出了几点建议,希望给初学者或有志于学习三维GIS的读者一点思考和启发

cyber_room的博客 1379

新一代XMOS会议四麦方案主控芯片 XVF3800

2023年,知名的音频芯片制造厂商 XMOS 正式发布了新一代会议麦阵芯片片 XVF3800 ,这款芯片采用最先进的四麦音频算法,可在嘈杂的环境中提供高质量语音,算法支持圆形、条形阵列,可根据应用场景组成不同的产品形态。传统的麦阵解决方案,不仅需要捕捉会议中的人声,也会同时捕捉环境中的其他噪声,而 XMOS 先进的语音算法解决了这一问题。声学回声消除功能可消除麦克风音频输入的回声,同时减少远端回声,使 XVF3800 能提取清晰的语音信号。• 180度拾音条形麦克风阵列。• 360度拾音环形麦克风阵列。

PawPaw_electron的博客 784

在优快云写博客12年了,提几点建议

从2020开始到现在一年多没有更新了,一方面是在工作中burn out了,其次是站在程序员的视角,优快云的变化我认为一些地方有待改进。 先说首页。头条/热点 内容有待提高。 之前的首页内容有很多“纯技术的内容”,例如Hadoop,spark大数据实践,云架构模式,开源框架推荐等等。个人认为比现在的内容更好一些,对程序员这个群体而言。 现在的首页资讯部分有点过于公司类的新闻(除了log4j以外和技术相关),不知道其他程序员是否有兴趣,至少对我个人而言兴趣不是很大。个人建议这部分新闻类可以放在不太显眼的位置

我的英文站点:https://iorilan.medium.com/ 2037

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1176

rknn-toolkit推理yolov5-face.rknn模型--python代码

import os import urllib import traceback import time import sys import numpy as np import cv2 from rknn.api import RKNN ONNX_MODEL = 'yolov5s.onnx' RKNN_MODEL = 'yolov5s.rknn' IMG_PATH = './bus.jpg' DATASET = './dataset.txt' QUANTIZE_ON = True BOX_THR.

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3079

简洁的JS代码--几点建议-积累ing

1. 常量$elem.on('keydown', function(e) { if (e.keyCode == 27) { //... } });27到底代表什么?代表ESC键。你可以在后边加上注释。不过,在这里我建议你使用一个常量名来代替,比如:KEY_ESC = 27。这样更加直观易懂!2.标识符(identifiers)我们经常需要获取某个元素(评论、博客、用户、等等)的标识符

xiaowei的博客 303

【华为OD机试真题】6、数组去重和排序 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序

KJ.JK 3888

java300行程序代码_神级程序员JavaScript300行代码搞定汉字转拼音

一.汉字转拼音的现状首先应该说,汉字转拼音是个强需求,比如联系人按拼音字母排序/筛选;比如目的地(典型如机票购买)按拼音首字母分类等等。但是这个需求的解决方案,但好像没听过什么巧妙的实现(特别是浏览器端),大概都需要一个庞大的字典。具体到JavaScript,查查github和npm,比较优秀的处理汉字转拼音的库有pinyin和pinyinjs,可以看到,两者都自带了庞大的字典。这些字典动辄几十上...

weixin_42525569的博客 321

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

告别排版焦虑!这些 Markdown 转 HTML 神器,让你效率翻倍!

Markdown 转 HTML 是前端开发中不可或缺的技能,而选择合适的工具可以事半功倍。Vue Marked 是一个基于Marked.js的Vue.js插件,专为Vue项目设计,简化了Markdown转换流程。React Markdown 是一个专门为React设计的Markdown解析器,支持丰富的插件系统,能够轻松扩展功能。Markdown-it 是一个高度可配置的Markdown解析器,支持丰富的插件和扩展功能。选择社区活跃度高的工具,可以获得更好的技术支持和更丰富的资源。

wujiayu31415的博客 3268

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

利于网站收录的几点小建议

提高网站的收录量,是每一个做网站seoer都非常重视的问题,因为,网站的收录数量,会直接影响到网站首页的排名,一个网站的收录量,也是衡量一个网站质量的重要标准。那么,如何提高网站收录呢?下面就结合自己的经验以及大家经常犯的错误,总结了一下,希望大家可以认真看一看: 1、不要采集过多的文章。如果你网站的文章大量来自于采集、或者是原封不动的复制过来,那可是不被搜索引擎喜欢的,是不会被收录的。 2、

我在沈阳 602

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

js控制台常用代码

谷歌浏览器怎么通过控制台下载一个页面的全部动态样式到本地,包括js注入的样式。@TOC保存完整 HTML 页面(含最终渲染样式) 如果你不仅想要样式,还想保留整个页面结构(包括 JS 动态生成的 DOM 和样式),可以使用下面这段代码: :一键下载所有样式内容(含 JS 动态注入) 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown

weixin_40367377的博客 868
上一篇: 树冠型打印目录下的问件
下一篇: 原型和原型链-转自网络资源
何厚勋
博客等级 码龄10年 14粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值