javascript匿名函数调用

Javascript anonymous function call

本问题已经有最佳答案,请猛点这里访问。

我在阅读Twitter上的JS源代码时,发现了调用匿名函数的奇怪方式:

1
2
3
!function( $ ) {
    ...
}( window.jQuery );

…这是可行的!:)

很明显,这是:

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

不工作(语法错误),但此错误正确:

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

有人能解释一下这种魔力吗(为什么用!function的例子有效)?


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

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

将声明括在括号内的做法相同,但比在声明前面加上!+更常见:

1
2
3
(function () {
    ...
}());


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

当表达式对函数进行计算时,可以使用()运算符调用该函数。

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

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

通过将函数放在圆括号内,可以再次将其转换为表达式,表达式的计算结果为函数。使用arg作为参数调用此函数。


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

命名函数可以是一个语句,但是匿名函数只把它当作一个表达式。

赞成的意见:你可以做function() { ... }()

反对的论点:你不能这样做。

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


至于感叹号,那不是魔法。它将结果转换为真/假。

您的问题可能是您的匿名函数中有一个错误。