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() { ... }
但为什么人们会想要定义一个匿名函数而不用调用它呢? 所以这个骗局并不是一个真正的问题。