js中的马上实行函数

js中的马上实行函数

( function(){…} )()和( function (){…} () )是两种javascript马上实行函数的罕见写法

题目:

为何会涌现上面的两种不一样的写法,上面的写法岂非不是简朴的就是一个括号包裹匿名函数对象,再在背面加个括号挪用函数,末了到达函数定义后马上实行的目标????然则并非我想的那末简朴

除了这两种经常运用的体式格局:
(function(){ //do something here;  })();
( function (){//do something here; }}());

另有一种体式格局为:
!function(){  // do something  }();

在这里开首要加上 ! 或许 ~ , – 和 +。(都是英文标记)
为何这里要这模样,为何要在前面加上()、!、+、-、=等运算符????

由于 JavaScript 文法明确规定表达式语句不得以 function 或许 {
为开首(http://es5.github.io/#x12.4

ExpressionStatement → [lookahead ∉ {{, function}] Expression;

好的如今带来更多的疑心了……

起首想要邃晓这个题目需要弄清函数表达式(function expression)和函数声明(function declaration)的区分:

函数表达式:

函数表达式中的函数可认为匿名函数,也能够有函数名,然则该函数实际上不能直接运用,只能经由过程表达式左侧的变量 a 来挪用。

var a = function(){
alert('Function expression');
};
var b = new a();

函数声明:

// 函数声明时必需有函数名

function a(){
alert('Function declaration');
}
a();

下面来看一下这段代码:

~function() { 
console.log("hi"); 
} (); 

实际上能够分为两个部份(~function() { console.log(“hi”)} 和()部份)前面部份的匿名函数经由过程一元操作符变成了函数表达式,因而能够经由过程在表达式的背面运用 () 来实行 。

因而,实行匿名函数能够经由过程+,-,!,() 这里的括号也是一种运算符,称为分组运算符
如许的情势来转化为函数表达式,就能够经由过程表达式的背面运用 () 来实行

一些其他的写法:

( 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 )

(1) function (){ }()

希冀是马上挪用一个匿名函数表达式,结果是进行了函数声明,函数声明必需要有标识符做为函数称号,而这里用()来做为标识符是不法的.

(2) function g(){ }()

希冀是马上挪用一个签字函数表达式,结果是声清楚明了函数 g。末端的括号作为分组运算符,必需要供应表达式做为参数。

function g(){ console.log("hi")}(1);
>1

所以那些匿名函数四周运用括号或一些一元运算符的惯用法,就是来指导解析器,指明运算符四周是一个表达式。

匿名函数的优点在于:能够削减局部变量,以避免污染现有的运转环境。jQuery等库都用到了如许的道理。
别的:经由过程+,-!这三个标记运转的匿名函数比()运转的匿名函数能够削减一个字符的运用,然则我们一般运用加(),由于其他的操作符可能会带来其他的影响

更多能够参考
ECMA-262-3 in detail. Chapter 5. Functions.

    原文作者:outshineamaze
    原文地址: https://segmentfault.com/a/1190000006052543
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞