0 Comments

JavaScript有关的10个秘密和怪癖(3)

发布于:2013-12-21  |   作者:广州网站建设  |   已聚集:人围观

7. 函数可以执行其本身

下面这个是很OK的:


  1. (function() { alert('hello'); })(); //弹出 'hello' 

这里的解析足够简单:声明一个函数,然后因为()解析立即执行它。你可能会奇怪为何要这么做(指直接屁股后面()调用),这看上去是有点自相矛盾的:函数包含的通常是我们想稍后执行的代码,而不是当下解析即执行的,否则,我们就没有必要把代码放在函数中。

另外一个执行函数自身(self-executing functions (SEFs))的不错使用是为在延迟代码中使用绑定变量值,例如事件的回调(callback),超时执行(timeouts)和间隔执行(intervals)。如下例子:


  1. var someVar ='hello';  
  2. setTimeout(function() { alert(someVar); }, 1000);  
  3. var someVar ='goodbye'

Newbies在论坛里总问这里timeout的弹出为什么是goodbye而不是hello?答案就timeout中的回调函数直到其运行的时候才去赋值someVar变量的值。而那个时候,someVar已经被goodbye重写了好长时间了。

SEFs提供了一个解决此问题的方法。不是像上面一样含蓄地指定timeout回调,而是直接将someVar值以参数的形式传进去。效果显著,这意味着我们传入并孤立了someVar值,保护其无论后面是地震海啸还是女朋友发飙咆哮都不会改变。
广州网站建设,网站建设,广州网页设计,广州网站设计


  1. var someVar = 'hello';  
  2. setTimeout((function(someVar) {  
  3. returnfunction() { alert(someVar); }  
  4. })(someVar), 1000);  
  5. var someVar ='goodbye'

风水轮流转,这次,这里的弹出就是hello了。这就是函数参数和外部变量的点差别了哈。

例如,最后一个按钮点击后的弹出如下:

 

 

浏览器

8. FireFox以RGB格式读与返回颜色而非Hex

直到现在我都没有真正理解为何Mozilla会这样子。为了有个清晰的认识,看下面这个例子:


  1. <!--  
  2. #somePara { color: #f90; }  
  3. --> 
  4. <p id="somePara">Hello, world!</p> 
  5. <script> 
  6. var ie = navigator.appVersion.indexOf('MSIE') !=-1;  
  7. var p = document.getElementById('somePara');  
  8. alert(ie ? p.currentStyle.color : getComputedStyle(p, null).color);  
  9. </script> 

广州网站建设,网站建设,广州网页设计,广州网站设计

 

 

 

大部分浏览器弹出的结果是ff9900,而FireFox的结果却是rgb(255, 153, 0),RGB的形式。经常,处理颜色的时候,我们需要花费不少代码将RGB颜色转为Hex。

下面是上面代码在不同浏览器下的结果:

 

 

其它杂七杂八

9. 0.1 + 0.2 !== 0.3

这个古怪的问题不只会出现在JavaScript中,这是计算机科学中一个普遍存在的问题,影响了很多的语言。标题等式输出的结果是0.30000000000000004。

这是个被称为机器精度的问题。当JavaScript尝试执行(0.1 + 0.2)这行代码的时候,会把值转换成它们喜欢的二进制口味。这就是问题的起源,0.1实际上并不是0.1,而是其二进制形式。从本质上将,当你写下这些值的时候,它们注定要失去精度。你可能只是希望得到个简单的两位小数,但你得到的(根据Chris Pine的注解)是二进制浮点计算。好比你想把一段应该翻译成中文简体,结果出来的却是繁体,其中还是有差异是不一样的。

一般处理与此相关的问题有两个做法:

转换成整数再计算,计算完毕再转换成希望的小数内容

调整你的逻辑,设定允许范围为不是指定结果。

例如,我们不应该下面这样:


  1. var num1=0.1, num2=0.2, shouldEqual=0.3;  
  2. alert(num1 + num2 == shouldEqual); //false 

而可以试试这样:


  1. alert(num1 + num2 > shouldEqual - 0.001&& num1 + num2 < shouldEqual +0.001); //true 

10. 未定义(undefined)可以被定义(defined)

我们以一个和风细雨的小古怪结束。听起来可能有点奇怪,undefined并不是JavaScript中的保留字,尽管它有特殊的意义,并且是唯一的方法确定变量是否未定义。因此:


  1. var someVar;  
  2. alert(someVar == undefined); //显示 true 

目前为止,一切看上去风平浪静,正常无比,但剧情总是很狗血:


  1. undefined ="I'm not undefined!";  
  2. var someVar;  
  3. alert(someVar == undefined); //显示 false! 

这就是为什么jQuery源码中最外部的闭包函数要有个并没有传入的undefined参数,目的就是保护undefined不要被外部的些不良乘虚而入。

 

原文:http://www.zhangxinxu.com/wordpress/?p=1703

标签:
飞机