经常使用闭包的学生必须非常了解以下代码:
//通常的闭包编写(function () {).}())那么我们的问题来了,为什么要在function () {之外用括号把它括起来.} ()?要解决这个问题,需要理解Javascript中函数表达式和函数声明的概念。
函数定义导致的错误
虽然函数(){ 0.}看起来像一个函数声明,其本质其实是一个函数表达式因为没有函数名。让我们看看规范中函数声明和函数表达式的定义:
可以看出,函数声明必须有函数名。因此,在执行函数(){时.}()直接,将报告语法错误,因为当函数表达式试图解析为函数声明时,找不到函数名。
然后我们继续尝试写函数名:
函数fn(){ 0.}()9502.163.com
系统仍会提示您语法错误,但此错误的位置如下()。
不解释为什么,看看下面的例子:
从这个结果可以看出,函数声明后的()将被解析为分组运算符,而不是函数调用。那么如何让函数执行呢?
如何正确解析函数表达式
根据规范,函数表达式必须在表达式中才能被正确解析。当()用作分组运算符时,它的内容将被视为表达式。
(函数(){ 0.}())(函数(){ 0.})()以上两种写法都是正确的。第一次写的很清楚,函数表达式被正确解析和调用。在第二篇文章中,解析器首先处理part (function () {).}).因为分组运算符不对其内容执行GetValue操作,所以在语句结束时,直接返回函数表达式,然后()指示函数调用。
让我们简单地用一个例子来说明:
var a=function()的例子.}(a()) //与(function () {相同.}())(a)() //与(function () {相同.})()稍微有些不合适,因为直接执行a(),但是直接执行function()是可行的
其他方式
如上所述,匿名函数可以通过分组运算符()正确理解为函数表达式。同样,我们可以通过许多其他操作符来正确执行函数表达式。
!function(){ }()void function(){ }()function(){ }()-function(){ }()if(function(){ }(){ }.因为很多运算符会改变函数返回值,比如!Function () {return 0}、void function () {}()、function () {}()等。所以我们通常使用()来包装匿名函数,以便它们可以被正确解析为函数表达式。
参考文章
http://www.zhihu.com/question/40902815/answer/88787368
http://www.zhihu.com/question/20292224