JavaScript中的感叹号前置函数是什么?

37

可能是重复问题:
函数前加叹号有什么作用?

我今天第一次看到这样格式化的函数:

!function(){}();

感叹号前面的符号有什么作用?我认为它的功能与以下代码相同:

(function(){})();

但是...这里到底发生了什么?

3个回答

46

前面的!会接收无法解析的语句,并使其能够被JS引擎解析,然后返回true。

function(){}();
SyntaxError: Unexpected token (

!function(){}();
>>true

38
这太具有误导性了,它使得代码无法被正确解析,将一个函数声明解析为表达式,而该表达式计算结果是函数本身,因此可以调用该函数。 - michelpm
我认为“无法解析”是准确的 - JavaScript虚拟机将无法解析第一个示例。 - Gershom Maes
@JeffHykin,你的评论很有趣又娱乐。不过我要指出,应该是“一元运算符”;) - valid
1
为了更加清晰(补充@michelpm的观点),+function(){}();-function(){}();都可以工作,因为+-可以是一元运算符。然而,!更可取,因为它只是一元运算符,而+-可以是二元和一元运算符。 - Jeff Hykin
哇,这让我感到很尴尬,谢谢@valid。很遗憾Stack Overflow在5分钟后不允许编辑评论。那个评论值得删除和修复。 - Jeff Hykin

14

这只是让JavaScript解析器将其解析为表达式,以便执行它。


1
这可能是动机,但结果表达式的行为仍与带有 ! 的任何表达式一样。 - Matthew Flaschen
5
@Matthew:我不能代表gaoshan88,但他似乎对动机很感兴趣,因为他(正确地)将其与另一种常见的自执行函数编写方式进行了比较。 - Matthew Crumley

13
我试过了,它返回了true。 这个函数返回undefined,并且!undefined是true。
!function(){}();
^          ^ ^
C          A  B
  • A. function(){}是一个空的匿名函数
  • B. ()执行函数(A),返回undefined
  • C. !undefined取反,变成true

我认为他们使用这个技巧是为了进行代码高尔夫或混淆的编码。实际上采用这种方式是不好的做法。

在您的浏览器地址栏中尝试javascript:alert(!function(){}())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接