《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") //
// 这样更快,但如果有字符就只能用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解析器)以在本地运行。
《javascript模式--by Stoyan Stefanov》书摘--基本技巧的更多相关文章
- 《javascript模式--by Stoyan Stefanov》书摘--汇总
<javascript模式--by Stoyan Stefanov>书摘--基本技巧 http://www.cnblogs.com/liubei/p/JavascriptModeLog1. ...
- 《javascript模式--by Stoyan Stefanov》书摘--字面量和构造函数
二.字面量和构造函数 1,能够使用对象字面量时,就没理由使用new Object构造函数 // 一个空对象var 0 = new Object();console.log( o.constructor ...
- 《javascript模式--by Stoyan Stefanov》书摘--函数
三.函数 1.函数的命名属性 // IE下不支持name属性 var foo = function bar () { // todo }; foo.name; // "bar" 2 ...
- 《JavaScript模式》第2章 基本技巧
@by Ruth92(转载请注明出处) 第2章 基本技巧 一.编写可维护的代码 阅读性好 具有一致性 预见性好 看起来如同一个人编写 有文档 编写注释 编写 API 文档 @namespace:用于命 ...
- javascript 模式(1)——代码复用
程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式
现代继承模式可表述为:其他任何不需要以类的方式考虑得模式. 现代继承方式#1 —— 原型继承之无类继承模式 function object(o) { function F() {}; F.protot ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式
实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象. 1.类式继承模式#1 —— 默认方式(原型指向父函数实例) function Paren ...
- 初涉JavaScript模式系列 阶段总结及规划
总结 不知不觉写初涉JavaScript模式系列已经半个月了,没想到把一个个小点进行放大,竟然可以发现这么多东西. 期间生怕对JS的理解不到位而误导各位,读了很多书(个人感觉JS是最难的oo语言),也 ...
- 【前端】javascript中10常用的个小技巧总结
javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了 ...
随机推荐
- 纯 js 实现跨域接口调用 jsonp
开发「bufpay.com 个人即时到账收款平台」的时候,支付页面需要 poll轮询 查询订单状态. bufpay 支付接口如下: 接口地址:https://bufpay.com/api/pay/ai ...
- 微信小程序之数据传递
本文主要介绍,页面跳转间的数据传递.传递的数据类型主要有1,基本数据类型:2,对象:3,数组集合: 先告诉你,本质上都是string类型传递.但是对于对象和数组集合的传递需要小小的处理一下传递时的数据 ...
- Windows远程常见问题
1.window2003远程桌面“已达最大连接数”解决:1)mstsc /v:(此处为服务器IP) /console 任务管理器注销已断开用户 mstsc /v:192.168.4.3 /cons ...
- 安装 vue-devtools
1. github下载 vue-devtools: git clone https://github.com/vuejs/vue-devtools 2. node install 安装包 3. vi ...
- phpstudy lamp
phpStudy for Linux (lnmp+lamp一键安装包 现在不考虑安装这个 (完整版:http://lamp.phpstudy.net/phpstudy-all.bin) 安装: wg ...
- 后端系统开发利器之gflags
gflags是Google的一个开源项目,用于解析程序运行参数.gflags简单易用,它的好处在于统一配置格式,减少开发工作量.在工程实践中,gflags在简化开发和测试方面表现非常出色,它还有一个很 ...
- WPF的退出
很多时候,会自己写退出程序的代码. 比如,先显示登录框(LogIn),成功后隐藏它,并显示一个主窗体(MainWin),或者外部还调用了其他App,当你关闭MainWin不一定会直接退出整个程序的. ...
- CodingLabs - MySQL索引背后的数据结构及算法原理
原文:CodingLabs - MySQL索引背后的数据结构及算法原理 首页 | 标签 | 关于我 | +订阅 | 微博 MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10 ...
- C#从Gif中提取图片
C#从Gif中提取图片的代码片段 private void btn_extract_Click(object sender, EventArgs e) { Image imgGif = Image.F ...
- VINS(三)IMU预积分
IMU的数据频率一般远高于视觉,在视觉两帧k,k+1之间通常会有>10组IMU数据.IMU的数据通过积分,可以获取当前位姿(p位置,q四元数表达的姿态).瞬时速度等参数. 在VIO中,如果参考世 ...