《编写可维护的JavaScript》——JavaScript编码规范(六)

变量、函数和运算符

 在讨论过基本的JavaScript书写格式化之后,接下来关注如何使用函数、变量和运算符来减少复杂度和增强可读性就显得十分重要了。

变量声明

变量声明是通过var语句来完成的。var语句几乎可以用在JavaScript脚本中的任意地方。不论var语句是否真正会被执行,所有的var语句都提前到包含这段逻辑的函数顶部执行。比如:

function doSomething() {
    var result = 10 + value;
    var value = 10;
    return result;
}

 在这段代码中,变量value在声明之前就参与了运算,这是完全合法的,尽管这会造成result的计算结果是一个特殊值NaN。这段代码被JavaScript理解成如下模样:

function doSomething() {
    var result;
    var value;

    result = 10 + value;
    value = 10;

    return result;
}

在第六行用到变量value的时候,它的值是undefined,因此result的值是NaN(非数字)。在那之后value才最终赋值为10。

一种流行的风格是将所有变量声明放在函数顶部而不是散落在各个角落。简言之,依照这种风格写出的代码逻辑和JavaScript引擎解析这段代码的习惯是非常相似的。建议总是将局部变量的定义作为函数内第一条语句。Crockford 的编程规范、SproutCore 编程风格指南和Dojo 编程风格指南也推荐这样做。

Crockford 还进一步推荐在函数顶部使用单var语句。

Dojo 编程风格指南规定,只有当变量之间有关联时,才允许使用单var语句。

我个人倾向于将所有的var语句合并为一个语句,每个变量的初始化独占一行,赋值运算符应当对齐。对于那些没有初始值的变量来说,它们应当出现在var语句的尾部。比如:

function doSomething(items) {
    var  value = 10,
          result = value+10,
          i,
          len;
     
    for(i=0, len=items.length; i<len; i++){
        doSomethingElse(items[i]);
    }
}

 函数声明

和变量声明一样,函数声明也会被JavaScript引擎提前。因此,在代码中函数的调用可以出现在函数的声明之前。

但我们推荐总是先声明JavaScript函数然后使用函数。

此外,函数声明不应当出现在语句块之内。函数声明应当在条件语句的外部使用。

严格模式

ECMAScript5 引入了“严格模式”(strict mode),希望通过这种方式来谨慎地解析执行JavaScript,以减少错误。通过使用如下指令脚本以严格模式执行。

"use strict";

尽管这看起来像是一个没有赋值给变量的字符串,但ECMAScript5 JavaScript引擎还是会将其识别为一条指令,以严格模式来解析代码。这条编译指令不仅用于全局,也适用于局部,比如一个函数内。不推荐将"use strict"用在全局作用域中,因为当你将11个文件连接合并成一个文件时,当其中一个文件在全局作用域中启用了严格模式,则所有的代码都将以严格模式解析。因此,最好不要在全局作用域中使用"use strict"。

//好的写法
function doSomething(){
    "use strict";
    //代码
}

如果你希望在多个函数中应用严格模式而不必写很多行"use strict"的话,可以使用立即执行的函数。

//好的写法
(function(){
    "use strict";
    function doSomething(){
        //代码
    }
    function doSomethingElse(){
        //代码
    }
})();

相等 

由于JavaScript具有强制类型转换机制,JavaScript中的判断相等操作是很微妙的。

发生强制类型转换最常见的场景就是,使用了判断相等运算符==和!=的时候。当要比较的两个值的类型不同时,这两个运算符都会有强制类型转换。但在很多实际情况中,代码并不按照我所期望的方式运行。

由于强制类型转换的缘故,我们推荐使用===和!==。用这些运算符作比较不会涉及强制类型转换。

<!--

作者:纤锐
出处:http://www.cnblogs.com/beginner2014
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。谢谢合作。

-->

原文地址:https://www.cnblogs.com/beginner2014/p/5429846.html