我读汤姆大叔的深入理解js(一)
前言
闲来看看javascript,在圆子里发现了汤姆大叔的文章,先是整体瞄了几眼,感觉不错,然后细细研读。记录下自己的学习历程和个人理解。更重要的是作为笔记
高质量JS代码
在看汤姆大叔的这一系列文章之前,写过js代码,但是没有多少理解(虽然现在也只是一个皮毛)。
最小全局变量规则
- js的作用域是通过函数来进行控制。函数内部申明的变量是函数内部使用,函数外不可用。而全局变量是函数外部或函数内部未申明直接使用的。
- 每个js环境都有一个全局对象即window,当你在任意函数外使用this都是指向他。更重要的是开发者创建的全部变量只是该对象的一个属性
全局变量的问题
- 首当其冲的就是冲突,你的js程序和web页面上所有的代码都共享了这些全局变量,在同一全局命名空间不同部分相同全局变量名不同作用,产生冲突然后会让部分代码不能正常执行。
- js隐含全局变量(个人认为这个最容易产生),js的两个特征造就了这一麻烦(个人观点);一是不需申明就可以使用变量,二是隐含全局概念,意味着你不申明的任何变量都会成为全局对象属性。隐式全局变量实例
- function mei(t,s){res=t+s;return res;},这个地方的res就是隐式全局变量。
- function mei(){var a=b=0; },此处a是本地变量,b则是全局变量。
减少全局变量的策略
- 命名空间模式,
- 函数立即自动执行,
- 始终使用var来声明变量(这是最重要的)。
忘记var副作用
- 采用var定义的全局变量是不能被删除,
- 隐式全局变量是window的属性从而也就是可以被删除。
单var形式
- 在函数首部采用单var定义变量,可以给一个整体的变量区域,方便查找
- 防止变量在没用被声明之前使用,而带来不确定的bug(我觉得这个是最重要的)
- 少代码
- 减少隐式全局变量的产生(个人认为)
预解析:var散布的问题
js在中,可以在函数中任何地方声明多个var变量,但是这跟你在函数的首部声明是一样的,这样就是hosting(悬置/置顶解析/预解析)。下面的这个例子可以很好的解释这一作用
myName = "global";//这是全局变量
function func(){
alert(myName);//undefined
var myName = "local";
alert(myName);//local
}
第一个alert之处没有打印global而是打印的undefined,标志局部变量已经定义,而只是没有赋值(能打印undefined就表明局部变量已经覆盖全局变量)。
for与for-in
for中主要强调在循环之前把长度先计算,避免在每次循环的时候进行长度的计算;还有就是页面dom的操作一般都是取得元素数组,如果在for中再进行实时计算,会花费大量的时间。
for中还有就是i++,i--采用i=i+1,i=i-1进行替换,还用采用向下。
for-in中主要讲解了hasOwnProperty对原型链的属性的过滤。
(不)扩展内置原型
增加内置构造函数原型,挺诱人,但可能降低代码的维护性,更有可能让你的代码带来不可预测性;另外可能让你的代码在不使用hasOwnPorperty进行筛选,可能让原型属性暴露出来。
以下我是一些技巧和规范的问题
- 多采用switch
- 避免隐式转换,提倡采用===进行比较,===会先检查比较的两边的数据类型是否是一样,不一样就返回false。减少很多不必要的bug。以下一个实例:var zero=0;if(zero===false){"不执行"};if(zero==false){"执行"}。这种执行的情况产生了隐式转换,可能产生不必要或者是潜在的bug。
- 避免eval();它接受任意的字符串当做js代码来执行。同样的setTimeout(),setInterval(),Function()构造函数传递字符串,要避免。(太随便的都是会有你想不到的)
写在最后
我写东西的初衷是记录我的学习历程,更重要的是作为笔记(强调);所以中间有错或者理解不对的地方,请大家指正。
posted on 2016-11-17 10:48 wee_culver 阅读(202) 评论(0) 收藏 举报
浙公网安备 33010602011771号