Javascript匿名函数调用

时间:2012-02-01 05:38:40

标签: javascript anonymous-function

当我遇到调用匿名函数的奇怪方式时,我正在阅读Twitter上的JS源代码 - 在我改进JS知识库的途中:

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

......这有效! :)

对每个人来说,显而易见的是:

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

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

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

任何人都可以解释这个魔法(为什么!function的情况有效)?

4 个答案:

答案 0 :(得分:66)

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

当在表达式位置满足关键字时(即不作为语句中的第一个标记,在您的示例中!是第一个标记),函数声明表示为函数表达式< / em>,可以是匿名的,并返回新创建的函数的值。由于它返回新创建的函数的值,因此可以通过在其后面添加括号来立即调用它。

将括号内的声明包装起来是相同的,但比使用!+作为前缀更为常见:

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

答案 1 :(得分:8)

第二种形式function () {}声明!运算符将其转换为表达式。您还会发现人们在-关键字之前使用+function的情况。

当你有一个表达式评估函数时,可以使用()运算符调用该函数。

另一种(可能更容易理解)实现保存相同效果的方法是使用另一组括号:

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

通过将函数放在括号内,再次将其转换为表达式,该表达式求值为函数。使用arg作为参数调用此函数。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

命名函数可以是一个语句,但匿名函数只是将其视为表达式。

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

缺点: 你做不到function() { ... }

但是为什么人们想要在不调用它的情况下定义匿名函数?因此,骗局并不是真正的问题。