《javascript模式--by Stoyan Stefanov》书摘--基本技巧

一、基本技巧

1,变量释放的副作用

a、使用var创建的全局变量(在函数外部创建)不能删除。

b、不使用var创建的隐含全局变量(尽管在函数内部创建)可以删除。

//    定义三个全局变量
var global_var  = 1;
global_novar = 2;            // 反模式
(function(){
      global_fromfunc = 3;    //  反模式
}())
  
 //  企图删除
delete global_var;   //  false
delete global_novar;   //  true
delete global_fromfunc;   // true
 
//  测试删除情况
typeof global_var;    //  "number"
typeof global_novar;    //  "undefined"
typeof global_var;    //  "undefined"

 在ES5 stick模式中,没有声明的变量赋值会报出错误(如上两种反模式)

 

2、只使用一个var并初始化为变量赋初值提供一个单一的地址以查找函数需要的所有局部变量)

 

3、for循环

优化操作原因:

a、使用了最少的变量

b、逐步减至0,这样通常更快,因为同0比较比同数组的长度比较,或同非0数组比较更有效率

//   优化前
function
() { var i = 0, max , myarray = []; // .... for ( i = 0, max = myarray.length, i < max; i++ ) { // 处理 myarray[i] } }
//  优化后 

var i , myarray = [];
for ( i = myarray.length; i-- ) {
    //处理  myarray[i]
}

//优化后  使用while循环

var myarray = [],
      i = myarray.length;
while ( i--) {
    //处理  myarray[i]
}

 

4、for-in循环(调用函数)

var i,
      hasOwn = Object.prototype.hasOwnProperty;
for ( i in man ) {
    if ( hasOwn.call( man, i ) ) {
        console.log(i, ":", man[i]);
    }  
}

 

5、内置的原型

if ( typeof Object.prototype.myMethod !== "function" ) {
    Object.prototype.myMethod = function (){
        // todo 
    }
}

 

6、避免使用eval(类似的还有setInterval(), setTimeout(), function())

 

//  反模式
var property = "name";
alert(eval( "obj." + property));

//  推荐的方法
var property = "name";
alert(obj[property]);

//  反模式
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

//  推荐的模式
setTimeout(myFunc(), 1000);
setTimeout(function () {
    myFunc(1, 2, 3)
}, 1000);

 

 

7、转换字符为数字

//   parseInt()必须指定进制参数,否则遇到以0开头的解析为八进制
var month = "06",
      year = "09";
month = parseInt(month, 10);
year = parseInt(year, 10);

//    另外一个字符串转换为数值的方法
+"08"               //结果是8
Number("08")    //8
//  这样更快,但如果有字符就只能用parseInt(),其他都会失败并返回NaN

 

8、开放的大括号的位置(应放在前面语句同一行)

//   警告:夫预期的返回值 
function func () {
      return
      {
             name : "finder"     
      };
}

//  等价于下面的形式
//   警告:夫预期的返回值 
function func () {
      return undefined;
    //  并未访问到接下来的代码
      {
             name : "finder"     
      };
}

//  总上,推荐以下写法
function func () {
      return {
             name : "finder"     
      };
}

 

9、空格

a、在函数中使用大括号开始符之前,例如if-else语句,循环语句和对象字面量等。

b、在大括号结束符和else或while之间

 

10、命名约定

a、构造函数首字母大写

b、使用下划线约定的变量:

  • 使用下划线说明是私有变量
  • 使用一个下划线标识受保护属性,使用两个下划线标识私有属性。
  • Firefox有一个属性,__proto__and__parent__

 

11、编写API文档

YUIDoc(Yahoo! User Interface )系统是一个和语言无关的系统,它仅仅解析注释的部分,而不解析javascript代码,缺点在于不得不在注释中声明属性名,参数名和方法名,例如@property first_name.而优点在于一旦适应了使用该系统进行注释,就可以使用该系统为任何其他语言的代码编写注释。

 

12、编写可读性强的代码

 

13、同行互查(cvs/svn/git)

 

14、在正式发布时精简代码

工具:YUICompress/Closure Compiler

 

15、运行JSLint

由javascript编写,可以作为 web工具使用,也可以下载下来并使用WSH(Windows Scripting Host)、JSC(Mac OSX的javascriptCore)、Rhino(Mozilla推出的javascript解析器)以在本地运行。

 

 

posted @ 2013-12-25 17:08  刘贝  阅读(399)  评论(0编辑  收藏  举报