JS里function前面的感叹号!

javascript里函数的定义方式有两种:函数表达式var fun=function(){}和函数声明function fun(){}。用fun()来执行调用。今天看某网站源码初次遇到感叹号开头的匿名 function,感到疑惑搜索后得到解答。

我们经常在各种地方遇到这两种书写方式:

(function(i){console.log(i)})("argv")  // argv

(function(i){console.log(i)}("argv"))  // argv

如果不用括号把函数包起来就会报错,因为javascript将function当作一个函数声明的开始,而函数声明后面不允许跟圆括号!然而函数表达式后面可以跟圆括号。要将函数声明转换成函数表达式,像上面给函数体加上圆括号即可。

function(i){console.log(i)}("argv")  //函数声明后加圆括号报错  

标题中提到function前面加感叹号和用()包围函数体作用相同:

!function(i){console.log(i)}("argv")  // argv

除了感叹号,+ - ~等符号放在function前也能起同样作用。

function前面加上void运算符也可以让 JavaScript引擎把一个函数识别成函数表达式而不是函数声明(语句)。

void function(i){console.log(i)}("argv")  // argv