当我遇到调用匿名函数的奇怪方式时,我正在阅读Twitter上的JS源代码 - 在我改进JS知识库的途中:
!function( $ ) {
...
}( window.jQuery );
......这有效! :)
对每个人来说,显而易见的是:
function ( $ ) { ... } ( window.jQuery )
不起作用(语法错误),而这个是正确的:
(function ( $ ) { .... })( window.jQuery )
任何人都可以解释这个魔法(为什么!function
的情况有效)?
答案 0 :(得分:66)
当在语句位置(作为语句中的第一个标记)满足关键字function
时,函数声明表示为函数语句。函数语句被提升到作用域的顶部,不能立即调用并且必须具有名称。
当在表达式位置满足关键字时(即不作为语句中的第一个标记,在您的示例中!
是第一个标记),函数声明表示为函数表达式< / em>,可以是匿名的,并返回新创建的函数的值。由于它返回新创建的函数的值,因此可以通过在其后面添加括号来立即调用它。
将括号内的声明包装起来是相同的,但比使用!
或+
作为前缀更为常见:
(function () {
...
}());
答案 1 :(得分:8)
第二种形式function () {}
是声明。 !
运算符将其转换为表达式。您还会发现人们在-
关键字之前使用+
或function
的情况。
当你有一个表达式评估函数时,可以使用()
运算符调用该函数。
另一种(可能更容易理解)实现保存相同效果的方法是使用另一组括号:
( function(x) { body; } )(arg);
通过将函数放在括号内,再次将其转换为表达式,该表达式求值为函数。使用arg
作为参数调用此函数。
答案 2 :(得分:0)
就感叹号而言,这不是魔术。 它将结果转换为true / false。
你的问题可能是你的匿名函数里面有错误。
答案 3 :(得分:0)
这听起来像是一个javascript语法错误:
命名函数可以是一个语句,但匿名函数只是将其视为表达式。
临:
你可以做function() { ... }()
缺点:
你做不到function() { ... }
但是为什么人们想要在不调用它的情况下定义匿名函数?因此,骗局并不是真正的问题。