编程是一门艺术活,好的代码应该就像住的房子一样,有整体的框架,有门,有窗户,相互独立又完美组合。你觉得门不够结实,就拆下来换个实心的;你觉得窗户不够明亮就换个全玻璃的,总之对房子的其他部位没有任何影响。所以说每一个程序员都应该有一颗设计师的心。本文主要从编码、变量、处理错误、对象等基础方面进行简单的探讨,希望能对大家的工作有所帮助~~
1 编码风格
老生常谈,我们先从最基础的编码说起吧!好的编码规范不仅仅能够提升代码的可读性与可维护性,提高团队的工作效率,也能够避开一些低级的错误,减少bug的隐患,提升程序员的自我修养。编码虽小,但却是万丈高楼的基础,对于编写清晰连贯的代码来说,每一个字符都是非常重要的。以下部分编码规范参考自凹凸实验室。
1.1 缩进
通常使用四个空格进行代码缩进,有些也用tab来缩进,这主要根据团队的风格跟个人喜好
1.2 空格
- 左括号与类名之间一个空格
- 冒号与属性值之间一个空格
- 操作符前后
- 匿名函数表达式之后等
1.3 空行
这是一个容易被大家忽略的点,但它所带来的效果是毋庸置疑的!通常一段代码的语义和另一段代码不相关,就应该用空行隔开,避免一大段的代码揉在一起,比如
- 在方法之间;
- 方法中的局部变量和第一条语句之间;
- 注释之前
- 方法内的逻辑片段之间
1.4 命名约定
有一位大师曾说过,计算机科学只存在两个难题:缓存和命名。由此可见命名不仅是一门科学,也是一门技术。
通常情况下,变量与函数一般使用驼峰大小写命名法,其中为了区分变量与函数,变量命名前缀应当是名词,函数前缀应当是动词,也就是说我们应当让命名承载一定的含义,因此要避免使用没有意义的命名。
1.4 注释
通常我们在编写完一段代码的短时间内,会清楚这段代码的工作原理。但是当过一段时间再次回到代码中,可能会花很长的时间才能读懂。这种情况下,编写注释就变得尤为重要了。
2 变量
首先说一说全局变量存在哪些的问题吧!命名冲突、测试难度大、深耦合等等。在创建变量的时候,我们应该注意以下几个方面
2.1 避免隐性的创建全局变量
什么是隐性的全局变量呢?官方的回答是:任何变量,如果未经声明,就为全局对象所有。啥意思呢?其实就是没有加var声明的,请看下面的例子
1 2 3 4 |
function obj() { name = "aotu"; return name; } |
另外一种容易创建隐形全局变量的情况就是var声明的链式赋值,如下代码所示
1 2 3 |
function person() { var a = b = 1; } |
以上这段代码的执行结果是:a是局部变量,b是全局变量,主要原因是从右至左的操作符优先级,它实际执行的结果等同于
1 |
var a = ( b = 0 ); |
综上所述,隐式全局变量并不是我们平时用var声明的变量,而是全局对象的属性,既然是属性,那么它可以通过delete操作符删除,但变量不可以,且在ES5 strict以上会抛出错误。
2.2 在函数顶部声明变量
在javascript中,声明变量有一个“提升”的概念,即无论在函数哪里声明,效果都等同于在函数顶部进行声明。所以我们统一把变量在函数顶部声明,既有利于可读性与可维护行,也不易出错。
2.3 使用单一var模式
1 2 3 |
var a = 1, b = 1, c = 1; |
这样声明的变量不仅可读性好,而且可以防止变量在定义前就被使用的逻辑错误,且编码更少。
2.4 单全局变量方式
虽然全局变量的容易污染命名空间,但有些功能的需要,难以避免使用,关键是我们应该做到避免全局变量超出我们的掌控,最佳的方法是依赖尽可能少的全局变量。我们可以使用单全局变量的方式来开启我们的项目,这种方式在许多的javascript类库中都有这样使用。如jQuery,它定义了两个全局变量$和jQuery。
3 UI松耦合
什么是松耦合?当修改一个组件的逻辑,而对另一个组件没有影响,就说这叫松耦合。通常一个大型的web应用,都是由多人共同开发维护,这时候松耦合显得至关重要,假如你修改了某一处的代码而影响了团队其他人的功能,这是非常不友好的。通常我们主要注意以下几点
- 将javascript从css中抽离,如避免使用css表达式
- 将csst从javascrip中抽离,如避免使用javascript直接修改css,最佳的方法是操作css的className;
- 将javascript从HTML中抽离,如避免将函数直接嵌入到html执行,我们应该尽量做到将所有的js代码都放入外置文件中,确保
html中不会有内联的js代码。 - 将html从javascript中抽离,如避免在js中拼接html结构,我们可以用模板引擎,也可以使用Vue、React等。
4 错误处理
4.1 为什么要抛出错误?
在javascript开发中,总是会悄无声息的出现一些超出我们预期的,携带的信息稀少的,隐晦含糊的bug,让我们措手不及,大大增加了我们调试错误、定位错误的难度,影响开发效率。假设错误中包含这样的信息:“由于某某情况,导致某某函数执行错误”,那么是不是马上就可以开始调试而不用花大量的时候去定位错误?
4.2 何时抛出错误?
主要是辨识代码中哪些部分在特定的情况下最后可能导致错误,这里的错误通常都是我们在思考的过程中的一些可预期的错误。
4.3 怎样抛出错误?
4.3.1 使用try-catch
将可能引发错误的代码放在try块中,处理错误的代码放在catch中,如
1 2 3 4 5 |
try { someMethod(); } catch (ex) { catchError(ex); } |
也可以增加一个finally块,这里需注意的是finally块中的代码块不管是否有错误发生,最后都会被执行。
4.3.2 throw
当我们能清晰的捕捉到错误的时候,最好的做法就是抛出这个错误,避免在不经意的时候又遇到它,让大家尴尬。这里需注意的是当遇到throw操作符时,代码会立即停止执行
1 |
throw new Error("method(): descdescdesc"); |
也可以自定义一个错误类型,总之就是尽可能用最短的字符描述清楚
1 2 3 4 5 |
throw { name: "myErrorType", message: "arguments must be a DOM element", errorMethod: errorMethod } |
5 创建对象
5.1 对象字面量
所谓的对象字面量其实就是我们通常所说的键值对哈希表,这种方式不仅富有表现力,可读性好,且字符更短,没有作用域解析。它的语法规则如下
- 对象包装在大括号中
- 逗号分隔属性和方法
- 用冒号分隔属性名称和属性的值
123456789var obj = {name: "aotu",job: "farmer",lass="crayon-v">name: "aotu",job: "farmer",互独立又完美组合。你觉得门不够结实,就拆下来换个实心的;你觉得窗户不够明亮就换个全玻璃的,总之对房子的其他部位没有任何影响。所以说每一个程序员都应该有一颗设计师的心。本文主要从编码、变量、处理错误、对象等基础方面进行简单的探讨,希望能对大家的工作有所帮助~~1 编码风格
老生常谈,我们先从最基础的编码说起吧!好的编码规范不仅仅能够提升代码的可读性与可维护性,提高团队的工作效率,也能够避开一些低级的错误,减少bug的隐患,提升程序员的自我修养。编码虽小,但却是万丈高楼的基础,对于编写清晰连贯的代码来说,每一个字符都是非常重要的。以下部分编码规范参考自凹凸实验室。
1.1 缩进
通常使用四个空格进行代码缩进,有些也用tab来缩进,这主要根据团队的风格跟个人喜好
1.2 空格
- 左括号与类名之间一个空格
- 冒号与属性值之间一个空格
- 操作符前后
- 匿名函数表达式之后等
1.3 空行
这是一个容易被大家忽略的点,但它所带来的效果是毋庸置疑的!通常一段代码的语义和另一段代码不相关,就应该用空行隔开,避免一大段的代码揉在一起,比如
- 在方法之间;
- 方法中的局部变量和第一条语句之间;
- 注释之前
- 方法内的逻辑片段之间
1.4 命名约定
有一位大师曾说过,计算机科学只存在两个难题:缓存和命名。由此可见命名不仅是一门科学,也是一门技术。
通常情况下,变量与函数一般使用驼峰大小写命名法,其中为了区分变量与函数,变量命名前缀应当是名词,函数前缀应当是动词,也就是说我们应当让命名承载一定的含义,因此要避免使用没有意义的命名。1.4 注释
通常我们在编写完一段代码的短时间内,会清楚这段代码的工作原理。但是当过一段时间再次回到代码中,可能会花很长的时间才能读懂。这种情况下,编写注释就变得尤为重要了。
2 变量
首先说一说全局变量存在哪些的问题吧!命名冲突、测试难度大、深耦合等等。在创建变量的时候,我们应该注意以下几个方面
2.1 避免隐性的创建全局变量
什么是隐性的全局变量呢?官方的回答是:任何变量,如果未经声明,就为全局对象所有。啥意思呢?其实就是没有加var声明的,请看下面的例子
1234function obj() {name = "aotu";return name;}另外一种容易创建隐形全局变量的情况就是var声明的链式赋值,如下代码所示
123function person() {var a = b = 1;}以上这段代码的执行结果是:a是局部变量,b是全局变量,主要原因是从右至左的操作符优先级,它实际执行的结果等同于
1var a = ( b = 0 );综上所述,隐式全局变量并不是我们平时用var声明的变量,而是全局对象的属性,既然是属性,那么它可以通过delete操作符删除,但变量不可以,且在ES5 strict以上会抛出错误。
2.2 在函数顶部声明变量
在javascript中,声明变量有一个“提升”的概念,即无论在函数哪里声明,效果都等同于在函数顶部进行声明。所以我们统一把变量在函数顶部声明,既有利于可读性与可维护行,也不易出错。
2.3 使用单一var模式
123var a = 1,b = 1,c = 1;这样声明的变量不仅可读性好,而且可以防止变量在定义前就被使用的逻辑错误,且编码更少。
2.4 单全局变量方式
虽然全局变量的容易污染命名空间,但有些功能的需要,难以避免使用,关键是我们应该做到避免全局变量超出我们的掌控,最佳的方法是依赖尽可能少的全局变量。我们可以使用单全局变量的方式来开启我们的项目,这种方式在许多的javascript类库中都有这样使用。如jQuery,它定义了两个全局变量$和jQuery。
3 UI松耦合
什么是松耦合?当修改一个组件的逻辑,而对另一个组件没有影响,就说这叫松耦合。通常一个大型的web应用,都是由多人共同开发维护,这时候松耦合显得至关重要,假如你修改了某一处的代码而影响了团队其他人的功能,这是非常不友好的。通常我们主要注意以下几点
- 将javascript从css中抽离,如避免使用css表达式
- 将csst从javascrip中抽离,如避免使用javascript直接修改css,最佳的方法是操作css的className;
- 将javascript从HTML中抽离,如避免将函数直接嵌入到html执行,我们应该尽量做到将所有的js代码都放入外置文件中,确保
html中不会有内联的js代码。 - 将html从javascript中抽离,如避免在js中拼接html结构,我们可以用模板引擎,也可以使用Vue、React等。
4 错误处理
4.1 为什么要抛出错误?
在javascript开发中,总是会悄无声息的出现一些超出我们预期的,携带的信息稀少的,隐晦含糊的bug,让我们措手不及,大大增加了我们调试错误、定位错误的难度,影响开发效率。假设错误中包含这样的信息:“由于某某情况,导致某某函数执行错误”,那么是不是马上就可以开始调试而不用花大量的时候去定位错误?
4.2 何时抛出错误?
主要是辨识代码中哪些部分在特定的情况下最后可能导致错误,这里的错误通常都是我们在思考的过程中的一些可预期的错误。
4.3 怎样抛出错误?
4.3.1 使用try-catch
将可能引发错误的代码放在try块中,处理错误的代码放在catch中,如
12345try {someMethod();} catch (ex) {catchError(ex);}也可以增加一个finally块,这里需注意的是finally块中的代码块不管是否有错误发生,最后都会被执行。
4.3.2 throw
当我们能清晰的捕捉到错误的时候,最好的做法就是抛出这个错误,避免在不经意的时候又遇到它,让大家尴尬。这里需注意的是当遇到throw操作符时,代码会立即停止执行
1throw new Error("method(): descdescdesc");也可以自定义一个错误类型,总之就是尽可能用最短的字符描述清楚
12345throw {name: "myErrorType",message: "arguments must be a DOM element",errorMethod: errorMethod}5 创建对象
5.1 对象字面量
所谓的对象字面量其实就是我们通常所说的键值对哈希表,这种方式不仅富有表现力,可读性好,且字符更短,没有作用域解析。它的语法规则如下
- 对象包装在大括号中
- 逗号分隔属性和方法
- 用冒号分隔属性名称和属性的值