一、基本技巧
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解析器)以在本地运行。