JavaScript中匿名函数,函数直接量和闭包(转)
    
原文出处: http://www.dnew.cn/post/196.htm 
先看下下面几种写法
1.function f(x){return x*x;};f(x); 
2.(function(x){return x*x;})(x); 
3.(function(x){return x*x;}(x));
第一种我们应该都很熟悉了,这是我们经常使用的写法。第二第三种都是匿名函数的写法。
--------------------------------------------------------------------------------
第二种 
可以这样理解: 
•var f=function(x) {return x*x;};f() 
那我们不通过f这个变量来引用函数就是
•function(){}() 
然而这样肯定是错误的就像
•var f=1+2; 
•f=f*0; 
与
•var f=1+2*0;
结果不同一样。 
要得到正确结果只能:
•f=(1+2)*0; 
也就是要明确的标识出程序块,即:
•(function(){})() 
肯你有疑问:括号“()”到底是不是起到了标识代码块的作用? 
我们可以用JavaScript的内置函数检测一下! 
举一个最简单的例子:
•alert(4) 
这段代码会弹出提示内容是“4” 
改成这样 
•(alert)(4) 
可以看到执行的效果和上一段代码一样。 
这种形式的函数执行也被很多JavaScript框架所采用。
--------------------------------------------------------------------------------
第三种,如果你用过jsvm框架的话就会发现里面的代码使用了这种形式。 
那如何解释第三种情况呢? 
为了弄明白浏览器是如何理解这样的写法的,我们可以利用一下Mozilla Firefox的错误控制台功能。 
在代码中插入一段错误代码,代码段如下: 
•(function(s){s+s}(1)).splice(); 
打开Mozilla Firefox的错误控制台,可以看到有如下的错误提示
错误: (function (s) {})(1) has no properties 
源文件:file:///C:/Documents…….html 
行:18
可以认为,浏览器对于 
•(function(s){s+s}(1)) 
这样的代码按照
•(function (s) {s+s})(1) 
来解析的。