Javascript匿名函数调用

我正在阅读来自Twitter的JS源代码 – 当我遇到了一种奇怪的调用匿名函数的方式时,我正在改进自己的JS知识库:

!function( $ ) { ... }( window.jQuery ); 

…这工作! 🙂

这是很明显的,

 function ( $ ) { ... } ( window.jQuery ) 

不起作用(语法错误),而这一个是正确的:

 (function ( $ ) { .... })( window.jQuery ) 

任何人都可以请解释这个魔术(为什么与!function作品)?

当语句位置(如语句中的第一个标记)符合关键字function ,函数声明被表示为函数语句 。 函数语句被提升到作用域的顶部,不能被立即调用并且必须有一个名字。

当关键字在expression式中被满足时(即不是在语句中的第一个标记,在你的例子中!是第一个标记),函数声明被expression为一个函数expression式 ,它可以是匿名的并且返回新创build的function。 由于它返回新创build函数的值,因此可以通过在其后面添加括号来立即调用它。

将括号内的括号括起来也是一样的,但是比用!+

 (function () { ... }()); 

第二种formsfunction () {}是一个语句 。 那! 运算符将其转换为expression式 。 你还会发现人们在function关键字之前使用-+的情况。

当你有一个函数expression式求值时,你可以使用()运算符来调用该函数。

另一个(也许更容易理解)的方式来实现保存相同的效果是另一套括号:

 ( function(x) { body; } )(arg); 

通过将函数放置在圆括号内,再次将其转换为expression式,该expression式将计算为函数。 这个函数是以arg作为参数来调用的。

就感叹号而言,这不是魔术。 它将结果转换为真/假。

你的问题可能是你的匿名函数里面有一个错误。

这听起来像一个JavaScript语法错误:

一个命名的函数可能是一个声明,但是,一个匿名函数只是将其视为一个expression式。

临:你可以做function() { ... }()

Con:你不能做function() { ... }

但为什么人们会想要定义一个匿名函数而不用调用它呢? 所以这个骗局并不是一个真正的问题。