HTML5参训笔记---javascript编写注意事项

来源:互联网 发布:微信 视频编辑软件知乎 编辑:程序博客网 时间:2024/05/01 23:56

一、javascript中避免起首的大括号换行的风格

<var log = function ()</span><br />{cosole.log("do not code with this style");}
应当使用起首大括号不换号的风格
<pre name="code" class="javascript">var log = function(){  console.log("code with this style");}



因为javascript解析器会将换行默认为是语句的结束,因此若采用起首大括号换行的编码风格的话,可能会导致javascript代码在执行的时候产生与预期行为不一致的现象。考虑一下代码

<pre name="code" class="javascript">var log = function(){  return {    suggestion : "do not code with this style"   }}   console.log(log());

控制台会输出什么值?答案是undefined。为什么呢?因为javascript解析器将换号编译成了语句的结束,即相当于在return后面加了个;所以返回的值自然是undefined。如果修改成如下代码则能正确的返回一个还有suggestion成员属性的对象了。

var log = function(){      return{        suggestion:"do not code with this style"       }    }   console.log(log());

二、在你js文件的开头加上;,因为不能确定浏览器再加载你js代码的时候是换行插入到其他js代码的后面还是不换行就插入,如果不换行就插入的话,很可能造成js执行的时候报错。

三、闭包容易导致内存泄露。所谓闭包指的是一个函数内部的引用期局部变量的一个内部函数,实现方式如下:

var closure = function() {  var local = "this is closure show" ;  return function() {    console.log(local);  };};closure ();
很显然,控制台会输出"this is closure show"。但是由于函数运行完以后,依然引用了该局部变量,所以内存回收的时候不会回收该局部变量,若该类变量持续增加的话,容易导致内存溢出。

四、在函数开头申明所有的局部变量。否则,容易由于和全局变量的冲突导致对变量引用的失败,看如下代码:

var global = "another suggestion" ;var error = function() {  console.log(global);  var global = "actually,this is a local variable";  console.log(global);};error();
事实上,运行这段代码,输出的值是“undefined”和“actually,this is a local variable”。为什么呢?其实在javascript解释器解释javascript代码时会将变量提前声明,因此在error函数中global变量会在第一次console.log(global)运行前被重新声明为局部变量,在原来声明为局部变量的位置再重新给global变量赋值,解析成类似代码如下:

var global = "another suggestion" ;var error = function() {  var global ;  console.log(global);  global = "actually,this is a local variable";  console.log(global);};error();

所以第一次运行console.log(global)时,输出的结果是undefined。

五、javascript解析的for循环优化比while循环优化做的好,推荐多使用for循环;另,for in循环实现的不好,因为每次循环执行时需要遍历所有变量包括从原型链继承来的,因此在遍历由多继承来的对象的时候,效率极低 。

六、javascript的自动类型装换方向是向基本数据类型转,且当字符串类型向数值型类型转换失败时返回NaN,NaN与任何数值型数据比较都返回false;如以下代码:

console.log("haha" == 1) ;

六、由于JavaScript是通过二进制浮点数的形式来表示实数的,因此不能够精确的表示十进制分数,比如1/10、1/100等。因此在数值比较中会存在一些问题,如下代码所示:

var x = .3 - .2 ; //运算后的结果是0.09999999999999998var y = 0.2 - 0.1 ;//运算后的结果是0.1x == y ; //运行结果为false
因此在JavaScirpt的数值比较运算中,尽量使用二进制的分数运算,不要使用10进制的分数进行运算。










                                             
0 0
原创粉丝点击