奇怪的匿名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的使用