function foo(){ / code / }();//SyntaxError: Unexpected token
function(){ / code /}(); //SyntaxError: Unexpected token
圆括号为了调用函数出现在函数后面时,无论在全局环境或者局部环境里遇到了这样的function关键字,默认的,它会将它当作是一个函数声明,而不是函数表达式.因为 JavaScript 文法明确规定表达式语句不得以 function 或者 { 开头.
所以便出现了下面几种形式:
(function(){/ code /}())
(function(){/ code /})()
!function(){/ code /}();
~function(){/ code /}();
-function(){/ code /}();
+function(){/ code /}();
…
最流行的也最被接受的方法是将函数声明包裹在圆括号里来告诉语法分析器去表达一个函数表达式,因为在Javascript里,圆括号不能包含声明。因为这点,当圆括号为了包裹函数碰上了 function关键词,它便知道将它作为一个函数表达式去解析而不是函数声明。
函数表达式 && 函数声明
函数表达式中的函数可以为匿名函数,也可以有函数名,但是不能直接使用,只能通过表达式左边的变量 a 来调用。var a = function(){
alert('Function expression');
}
var b = new a();
函数声明时必须有函数名function a(){
alert('Function declaration');
}
a();
`
`
匿名函数通过一元操作符变成了函数表达式,因而可以通过()来调用。
因此,执行匿名函数可以通过+,-,!,() 这样的形式来转化为函数表达式,就可以通过()来运行了。