( function(){…} )()和( function (){…} () )是两种javascript当即执行函数的常见写法javascript
为何会出现上面的两种不同的写法,上面的写法难道不是简单的就是一个括号包裹匿名函数对象,再在后面加个括号调用函数,最后达到函数定义后当即执行的目的????然而并非我想的那么简单java
除了这两种经常使用的方式: (function(){ //do something here; })(); ( function (){//do something here; }}()); 还有一种方式为: !function(){ // do something }();
在这里开头要加上 ! 或者 ~ , - 和 +。(都是英文符号)
为何这里要这样子,为何要在前面加上()、!、+、-、=等运算符????git
由于 JavaScript 文法明确规定表达式语句不得以 function 或者 {
为开头(http://es5.github.io/#x12.4)github
ExpressionStatement → [lookahead ∉ {{, function}] Expression;
首先想要明白这个问题须要弄清函数表达式(function expression)和函数声明(function declaration)的区别:express
函数表达式中的函数能够为匿名函数,也能够有函数名,可是该函数实际上不能直接使用,只能经过表达式左边的变量 a 来调用。ecmascript
var a = function(){ alert('Function expression'); }; var b = new a();
// 函数声明时必须有函数名函数
function a(){ alert('Function declaration'); } a();
~function() { console.log("hi"); } ();
实际上能够分为两个部分(~function() { console.log("hi")} 和()部分)前面部分的匿名函数经过一元操做符变成了函数表达式,于是能够经过在表达式的后面使用 () 来执行 。es5
所以,执行匿名函数能够经过+,-,!,() 这里的括号也是一种运算符,称为分组运算符
这样的形式来转化为函数表达式,就能够经过表达式的后面使用 () 来执行code
( function() {}() ); ( function() {} )(); [ function() {}() ]; ~ function() {}(); ! function() {}(); + function() {}(); - function() {}(); delete function() {}(); typeof function() {}(); void function() {}(); new function() {}(); new function() {}; var f = function() {}(); 1, function() {}(); 1 ^ function() {}(); 1 > function() {}();
function (){console.log("hi")}(); VM354:1 Uncaught SyntaxError: Unexpected token ) function g(){ console.log("hi")}(); VM519:1 Uncaught SyntaxError: Unexpected token )
指望是当即调用一个匿名函数表达式,结果是进行了函数声明,函数声明必需要有标识符作为函数名称,而这里用()来作为标识符是非法的.对象
指望是当即调用一个具名函数表达式,结果是声明了函数 g。末尾的括号做为分组运算符,必需要提供表达式作为参数。
function g(){ console.log("hi")}(1); >1
因此那些匿名函数附近使用括号或一些一元运算符的惯用法,就是来引导解析器,指明运算符附近是一个表达式。
匿名函数的好处在于:能够减小局部变量,以避免污染现有的运行环境。jQuery等库都用到了这样的原理。
另外:经过+,-!这三个符号运行的匿名函数比()运行的匿名函数能够减小一个字符的使用,可是咱们一般使用加(),由于其余的操做符可能会带来其余的影响