奇怪的匿名javascript函数调用

奇怪的匿名javascript函数调用,javascript,Javascript,我在看一段很酷的片段,在js中我发现了这条奇怪的线 以及删除阻止调用该函数的 !+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+! function(d, w){ ... }(document, window); ,我用()包装了函数,它按预期工作 (function(d, w){ ... })(document, window); 所以我的问题是,这条奇怪的线是什么,为什么它会起作用?我的不速之客是,这是一种生活…诀窍实际上是单曲

我在看一段很酷的片段,在js中我发现了这条奇怪的线 以及删除阻止调用该函数的

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);
,我用()包装了函数,它按预期工作

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

所以我的问题是,这条奇怪的线是什么,为什么它会起作用?我的不速之客是,这是一种生活…

诀窍实际上是单曲
运算符(整个第一行实际上执行相同的操作)。这同样适用于:

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

像往常一样,我可以推荐本·阿尔曼斯关于

的伟大文章,你是对的,这是一篇

你可以重写

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);

它仍然有效。这是因为
是一个一元运算符(就像
+
-
~
——请参阅)。 在一元运算符之后,需要(并计算!)表达式。表达式可以是函数调用

然而

!function() {
    ...
}()
只是另一个表达式,因此可以在其前面放置另一个一元运算符:

+!function() {
    ...
}()
您可以按照自己的意愿继续此模式

注意:以这种方式调用匿名函数会忽略函数的返回值。因此,如果您对返回值不感兴趣,请仅使用此选项


编辑:添加了一个很好的参考,达夫在回答中提到了这个参考。

它不是
操作员技巧!要详细说明重复的代码:
+
-
是所有一元运算符都在做与单独的
相同的事情在链接的副本中。@apsiller这样那些副本就没有必要了?@MimiEAM正确,只有一个
+
-
是将函数解析为函数表达式(而不是函数声明)所必需的。感谢您的澄清:)谢谢,我希望我能接受这两个答案
+!function() {
    ...
}()