我正在看这个非常酷的片段,我在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在他的回答中提到.