5

我正在看这个非常酷的片段,我在 js 中遇到了这个奇怪的行并删除了阻止函数被调用的行

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

,我用 ( ) 包装了函数,它应该是这样的,它按预期工作。

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

所以我的问题是那条奇怪的线是什么,为什么它会起作用?我的狂野客人是,它是某种 IIFE ......

4

2 回答 2

11

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

你可以重写

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

!function() {
    ...
}()

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

然而

!function() {
    ...
}()

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

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

您可以根据需要继续此模式。

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

编辑:添加了对Daff 在回答中提到的http://benalman.com/news/2010/11/immediately-invoked-function-expression/的出色参考。

于 2013-04-23T13:20:29.073 回答
4

诀窍实际上是!那里的单个运算符(整个第一行实际上做同样的事情)。这也可以:

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

一如既往,我可以推荐 Ben Almans 关于立即调用函数表达式的精彩文章

于 2013-04-23T13:18:37.767 回答