奇怪的匿名javascript函数调用[重复]

Posted

技术标签:

【中文标题】奇怪的匿名javascript函数调用[重复]【英文标题】:strange anonymous javascript function call [duplicate] 【发布时间】:2013-04-16 17:20:00 【问题描述】:

我在看this 非常酷的 sn-p,我在 js 中遇到了这条奇怪的线 并删除阻止函数被调用的内容

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

,我用 ( ) 包装了该函数,它按预期工作。

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

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

【问题讨论】:

它不是 ! 运算符棘手.. ! 详细说明副本:+-! 都是一元运算符,与链接副本中的单独 ! 执行相同的操作。 @apsillers 所以这些重复是不必要的? @MimiEAM 正确,只需一个+-! 即可将函数解析为函数表达式(而不是函数声明)。 【参考方案1】:

你是对的,它是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() 
    ...
()

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

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

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

【讨论】:

感谢您的澄清 :)【参考方案2】:

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

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

一如既往,我可以在 Immediately-Invoked Function Expressions 上推荐 Ben Almans 的精彩文章

【讨论】:

谢谢,我希望我能接受这两个答案

以上是关于奇怪的匿名javascript函数调用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

javascript匿名函数变量赋值[重复]

javascript--函数

JavaScript 函数

JavaScript-函数(调用参数returnarguments匿名回调递归函数)函数案例

JavaScript之 ------ 函数(一般函数动态函数匿名函数)