奇怪的匿名javascript函数调用

strange anonymous javascript function call

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

我在看这个非常酷的片段,我在JS中遇到了这条奇怪的线。以及删除阻止调用函数的

1
2
3
4
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);

,我用()包装了函数,它按预期工作。

1
2
3
(function(d, w){
    ...
})(document, window);

所以我的问题是,这条奇怪的线是什么,为什么会起作用?我的狂野的客人是这是一种生活…


你是对的,它是一个立即调用的函数表达式(IIFE)

你可以重写

1
2
3
4
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);

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

它仍然有效。这是因为!是一元运算符(就像+-~一样——请参见https://developer.mozilla.org/en-us/docs/javascript/guide/expressions ou and_operators)。在一元运算符之后,应输入表达式(并计算!)。表达式可以是函数调用。

然而

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

只是另一个表达式,因此可以在它前面放置另一个一元运算符:

1
2
3
+!function() {
    ...
}()

您可以按照自己的意愿继续这个模式。

注意:这样调用匿名函数时,忽略函数的返回值。因此,如果您对返回值不感兴趣,那么只使用这个。

编辑:在http://benalman.com/news/2010/11/immediately-invoked-function-expression/中添加了一个很好的参考,daff在他的回答中提到了这个参考。


诀窍实际上是单个的!操作符(整个第一行实际上做相同的事情)。这也同样有效:

1
2
3
!function(d, w){
   ...
}(document, window);

像往常一样,我可以推荐本·阿尔曼关于立即调用函数表达式的伟大文章