00-2. Javascript 规范 及 注意事项

  1. 变量声明 及 作用域
    1. 避免声明全局变量
      1. 全局变量 就是 在任何函数外面声明的 或是 未声明直接简单使用的。
      2. 原因:可移植性。如果你想你的代码在不同的环境下(主机下)运行,使用全局变量如履薄冰,因为你会无意中覆盖你最初环境下不存在的主机对象(所以你原以为名称可以放心大胆地使用,实际上对于有些情况并不适用)。
    2. JavaScript 通过函数管理作用域
    3. 由于JavaScript 的两个特征,容易不自觉地创建出全局变量
      1. 首先,你可以甚至不需要声明就可以使用变量,JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性
      2. 另一个创建隐式全局变量的情况就是使用任务链 进行部分 var声明。
        1. var a = b = 0;  从右到左的赋值,首先,是赋值表达式 b = 0,此情况下 b是未声明的。就好比你输入了:var a = (b = 0);
    4. 隐式全局变量 和 明确定义的全局变量间有些小的差异,就是通过 delete操作符让变量未定义的能力。
      1. 通过 var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
      2. 无 var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。
        1. 这表明在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过 delete操作符删除的,而变量是不能的:
    5. var形式,您可以使用一个 var语句声明多个变量,并以逗号分隔
      1. 好处:提供了一个单一的地方去寻找功能所需要的所有局部变量
        像这种初始化变量同时初始化值的做法是很好的。这样子可以防止逻辑错误(所有未初始化但声明的变量的初始值是 undefined )和增加代码的可读性。在你看到代码后,你可以根据初始化的值知道这些变量大致的用途,例如是要当作对象呢还是当作整数来使。
      2. 随着var形式,你可以把变量从循环中提出来,就像下面这样:
        这种形式具有一致性的好处,因为你坚持了 单一  var形式。不足在于当重构代码的时候,复制和粘贴整个循环有点困难。
      3. 预解析:var散布的问题
        1. JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting悬置/置顶解析/预解析)。
  2. 避免隐式类型转换
    1. 在你 比较 值和表达式类型 的时候始终使用 === 和 !== 操作符。
  3. 命名规范
    1. 因为 构造函数 本质还是函数,通过规范函数名 就可以帮助告诉你这应该是一个 构造函数 还是一个 正常的函数
      1. 命名构造函数时 首字母大写 具有暗示作用,使用 首字母小写 命名的  函数和方法 不应该使用 new调用:
    2. 多单词命名
      1. 当你的变量 或是 函数名 有多个单词的时候,最好单词的分离遵循统一的规范,
        1. 对于构造函数,可以使用大驼峰式命名法,如: MyConstructor()
        2. 对于函数和方法,可以使用小驼峰式命名法,如: myFunction(), calculateArea()getFirstName()
        3. 要是变量呢?
          1. 开发者通常使用小驼峰式命名法,但还有另外一种做法:所有单词小写以下划线连接。例如,first_name, favorite_bands 和 old_company_name,这种标记法 帮你直观地区分 函数 和 其他标识(原型和对象)。
    3. 其它命名形式
      1. JavaScript 中没有定义常量的方法,所以开发者都采用全部单词大写 的规范来命名这个程序生命周期中都不会改变的变量,
      2. 还有另外一个完全大写的惯例:全局变量名字全部大写
      3. 另外一种使用规范来模拟功能的是私有成员,开发者发现仅仅使用一个下划线前缀来表示一个私有属性或方法会更容易些。下面是一些常见的 _private规范:
        1. 使用 尾下划线 表示私有,如name_ 和 getElements_()
        2. 使用一个下划线前缀 表示 _protected(保护)属性两个 下划线前缀 表示 __private (私有)属性
        3. Firefox 中一些 内置的变量属性 不属于 该语言的技术部分,使用两个前下划线两个后下划线表示,如:__proto____parent__
  4. 尽量不用 eval(),容易污染全局
    1. 同样重要的是要记住,给setInterval(), setTimeout()Function()构造函数传递字符串,大部分情况下,与使用eval()是类似的,因此也要避免。在幕后,JavaScript 仍需要解析和执行你给程序传递的字符串:
    2. 如果你绝对必须使用eval()
      1. 可以考虑使用new Function()(类似于eval())代替。且有一个小的潜在好处,因为在新Function()中作代码评估是局部函数作用域中运行,所以代码中任何被评估的通过 var定义的变量都不会自动变成全局变量。
        1. 与 eval()的区别
          1. eval() 可以访问和修改它外部作用域中的变量,这是 Function做不来的(注意:使用Function 和 new Function是相同的)。
      2. 另一种方法来阻止自动全局变量是封装eval()调用到一个即时函数中。因为eval() 使用在它被调用的执行上下文的变量对象。
    3. 拓展,动态变量 的创建和引用!(整理)
  5. for-in循环
    1. 数组使用正常的for循环,对象使用for-in循环。
      1. hasOwnProperty()方法,当遍历对象属性的时候可以过滤掉从原型链上下来的属性。
        1. 另外一种使用hasOwnProperty()的形式是取消Object.prototype上的方式。像是:
          其好处:避免与  man 对象  重新定义 hasOwnProperty 命名冲突。当然为了避免了长属性查找对象的所有方法,你可以使用局部变量“缓存”它。

  6. 花括号{}
    1. 花括号(亦称大括号,下同)应总被使用,即使在它们为可选的时候。技术上将,在if判断、in或是for中如果语句仅一条,花括号是不需要的,但是你还是应该总是使用它们,这会让代码更有持续性和易于更新。
    2. 左花括号的位置
      1. 开发人员对于左大括号的位置有着不同的偏好——在同一行或是下一行。但如下示例中,括号位置不同会有不同的行为表现 -- 这是因为分号插入机制 ,当你选择不使用分号结束一行代码时JavaScript会自己帮你补上。
        这种行为可能会导致麻烦,如当你返回对象字面量,而左括号却在下一行的时候:
        如果你希望函数返回一个含有name属性的对象,你会惊讶。由于隐含分号,函数返回 undefined。前面的代码等价于:
  7. sss

猜你喜欢

转载自www.cnblogs.com/lhsaq2009/p/9124376.html
今日推荐