一、for(var i = 0, max = myArray.length; i < max ; i++){数组
//用myArrayy[i]来作点什么 闭包
}模块化
用max存储myArray的长度,防止每次循环去读取数组长度,尤为是当设计到DOM节点集合时,可明显提升效率。(2016-08-22)函数
二、function foo(){spa
var a = b = 0; 设计
}对象
b会声明为全局变量。缘由是:从右到左的赋值过程,首先是 b = 0 ,此状况下b是未声明的,而后是 var a = b;实际顺序为 var a = ( b = 0);(2016-08-22)blog
三、switch模式(switch Pattern)ip
能够经过相似下面形式的switch语句加强可读性和健壮性:作用域
var inspect_me = 0,
result = '';
switch(inspect_me){
case 0:
result = 'zero';
break;
case 1:
result = 'one';
beak;
default:
result = 'unknown';
}
四、适合使用空格的地方包括:
-> for循环分号分开后的部分:如for(var i = 0; i < 10; i++){...}
-> for循环中初始化的多变量(i和max): for(var i = 0, max = 10; i < max; i++){...}
-> 分隔数组项的逗号的后面: var a = [1, 2, 3];
-> 对象属性逗号的后面以及分隔属性名和属性值的冒号的后面: var o = {a: 1, b: 2};
-> 限定函数参数: myFunction(a, b, c)
-> 函数声明的花括号的前面: function myFunc() {...}
-> 匿名函数包大师function的后面:var myFunc = function () {};
五、JS 表达式和声明存在着十分微妙的差异。首先,函数声明会在任何表达式被解析 和求值以前 先被解析和求值,即便你的声明在代码的最后一行,它也会在同做用域内第一个表达式以前被解析/求值,参考以下例子,函数fn是在alter以后声明的,可是在alert执行的时候,fn已经有定义了:
alert(fn());
function fn(){
return 'Hello World ...';
}
六、var f = function foo(){
return typeof foo; // foo是在内部做用域内有效
}
//foo 在外部做用域是不可见的
typeof foo ; // "undefined"
f();// "function"
七、Module模式的基本特征:
-> 模块化,可重用;
-> 封装了变量和function,和全局的namespace不接触,松耦合
-> 只暴露可用public方法,其它是由方法所有隐藏
var Calculator = function(eq){
//这里能够声明是由成员
var eqCt1 = document.getElementById(eq);
return {
//暴露公开的成员
add: function(x, y){
var val = x + y;
eqCtl.innerHTML = val;
}
}
}
咱们能够经过以下的方式来调用:
var calvulator = new Clculator('eq');
calculator.add(2,2);
八、引用全局变量
JavaScript有一个特性叫作隐式全局变量,无论一个变量有没有用过,JavaScript解释器反向遍历做用域链来查找整个变量的var声明,若是没有找到var,解释器则假定该变量是全局变量,若是该变量用于了赋值操做的话,以前若是不存在的话,解释器则会自动建立它,这就是说在匿名闭包里使用或建立全局变量很是容易,不过比较困难的是,代码比较难管理,尤为是阅读代码的人看着不少区分哪些变量是全局的,哪些是局部的。
不过,好在在匿名函数里咱们能够提供一个比较简单的替代方案,咱们能够将全局变量当成一个参数传入到匿名函数而后使用,相比隐式全局变量,它又清晰又快,咱们来看一个例子:
(function($, YAHOO){
// 这里,咱们的代码就可使用全局的jQuery对象了,YAHOO也是同样
})(jQuery, HAHOO);
如今不少类库里都有这种使用方式,好比jQuery源码。
不过,有时候可能不只仅要使用全局变量,而是也想声明全局变量,如何作呢?咱们能够经过匿名函数的返回值来返回这个全局变量,这也就是一个基本的Module模式,来看一个完整的代码:
var blogMoudle = (function(){
var my = {}, privateName = '博客园 ';
function privateAddTopic(data){
//这里是内部处理代码
}
my.Name = privateName;
my.AddTopic = function(data){
privateAddTopic(data);
};
return my;
})();
上面的代码声明了一个全局变量blogModule,而且带有2个可访问的属性:blogModule.AddTopic和blogModule.Name,除此以外,其它代码都在匿名函数的闭包里保持着私有状态。同时根据上面传入全局变量的例子,咱们也能够很方便地传入其它的全局变量。