2013-04-23 92 views
2

我看着this非常酷的片段,我在防止函数被调用奇怪匿名的JavaScript函数调用

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

的JS 和删除碰到这种怪异的线,我包裹着的功能( ),因为它应该是和它按预期工作。

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

所以我的问题是什么是古怪的线,为什么它的工作?我的野客是这是一种IIFE ...

+0

它不是'!'操作符棘手..! – rab 2013-04-23 13:21:45

+1

详细说明重复项:'+','''和'!'是与链接副本中单独的'!'完全相同的一元运算符。 – apsillers 2013-04-23 13:21:54

+0

@过滤器,这些重复是不必要的? – MimiEAM 2013-04-23 15:10:03

回答

11

而且你是对的,这是一个Immediately-Invoked Function Expression (IIFE)

可以重写

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

!function() { 
    ... 
}() 

它仍然有效。这是因为!是一元运算符(就像+,-~-见https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators)。 预期一个表达式的一元运算符(并进行评估!)后。表达式可以是一个函数调用。

然而

!function() { 
    ... 
}() 

只是另一种表达,所以你可以把其他一元运算符在它的前面:

+!function() { 
    ... 
}() 

如你愿意,你可以继续这种模式。

说明:以这种方式调用匿名函数会忽略函数的返回值。所以只有使用这个,如果你对返回值不感兴趣。

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

+0

感谢您的澄清:) – MimiEAM 2013-04-23 15:10:54

4

诀窍实际上是那里的单个!运算符(整个第一行实际上做同样的事情)。这将很好的工作:

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

像往常一样,我可以推荐本Almans大文章上Immediately-Invoked Function Expressions

+0

谢谢,我希望我可以接受这两个答案 – MimiEAM 2013-04-23 15:11:22