周末正好有空就研究了下汤姆大叔的js系列博客,虽然只是学到点皮毛,依然获益匪浅。不得不说大牛的境界岂是吾等小辈可理解。
变量:
js有隐含的全局概念,意味着不声明的所有变量都是全局对象的属性。
function sum(x,y){ var res = x + y; return res; }
以上隐式声明全局变量的做法会多出一个全局命名空间,这显然不是我们想要的。
function sum(x, y) { var res= x + y; return res; }
所以记住始终使用var声明变量。
funtion num(){ var a = b = 0; }
以上链式声明变量依然是隐式声明全局变量。有朋友可能会疑惑,在局部里声明的变量怎么就变全局变量了!
但结果就是:a是局部变量,b是全局变量。
这是因为这个从右到左的赋值,首先是赋值表达式b = 0,但b没有声明,自然b就成全局变量了;然后再把0返回给声明了的a。这跟如下的代码同理:
function num(){ var a = {b = 0}; }
所以一次先声明所有需要声明的变量是比较好的习惯,并且在函数的顶部使用链式分配会更加容易阅读与修改:
function(){ var a,b; }
var的另一个比较少用一点的就是:
用var声明的全局变量是不能被delete删除的;而没用var声明的全局变量是能被delete删除。
// 反例 myname = "global"; // 全局变量 function func() { alert(myname); // "undefined" var myname = "local"; alert(myname); // "local" } func();
这是一个比较少注意到的问题,就是var声明不是放在函数顶部所造成的未定义。你可能会以为第一次弹窗会弹出'global',其实是undefined。
原因是myname被当做了局部变量,而第一个alert时该变量还未声明。等同于以下代码:
myname = "global"; // global variable function func() { var myname; // 等同于 -> var myname = undefined; alert(myname); // "undefined" myname = "local"; alert(myname); // "local"} func();
顺便提一下代码是怎么处理的:第一阶段是解析变量以及函数和参数等,第二阶段才是执行代码。
for循环:
平常我们使用for循环一般是如下形式:
for(var i=0 i<arr.length; i++){ console.log(arr[i]); }
但更好的办法是先缓存集合或者数组的长度:
var i,arrLen; for(i=0,arrLen=arr.length;i<arrLen;i++){ ... }
还可以进一步优化的部分就是用i--代替i++,原因是向下数到0通常会更快:
var i; for(i=arr.length;i--;){ ... }
或者是使用while:
var i = arr.length; while(i--){ ... }
这些优化只会体现在性能上,实际项目中才能体现威力。