奇怪的匿名javascript函数调用

Mim*_*EAM 2 javascript

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

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);
Run Code Online (Sandbox Code Playgroud)

,我将函数包装成(),因为它应该是,它按预期工作.

(function(d, w){
    ...
})(document, window);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是什么是奇怪的线,为什么它有效?我狂野的客人是它是某种IIFE ......

tes*_*ssi 11

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

你可以重写

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);
Run Code Online (Sandbox Code Playgroud)

!function() {
    ...
}()
Run Code Online (Sandbox Code Playgroud)

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

然而

!function() {
    ...
}()
Run Code Online (Sandbox Code Playgroud)

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

+!function() {
    ...
}()
Run Code Online (Sandbox Code Playgroud)

您可以根据需要继续使用此模式.

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

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