!javascript中的前一个函数?

IT技术 javascript
2021-03-03 07:20:53

可能的重复:
感叹号在函数之前有什么作用?

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

!function(){}();

前面的感叹号是什么意思?我假设它的功能与:

(function(){})();

但是……这是怎么回事?

3个回答

前面!的语句采用 un-parseable 语句,并允许它被 JS 引擎解析,然后返回 true。

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

!function(){}();
>>true
这是如此具有误导性,它不会使任何可解析的东西,它使函数声明被解析为表达式,计算为函数本身,允许它被调用。
2021-04-19 07:20:53
@JeffHykin 您的评论既有趣又有趣。但是,我会指出它应该说“一元”;)
2021-04-21 07:20:53
我实际上认为“不可解析”是准确的——js vm 不会解析第一个例子。
2021-04-27 07:20:53
为了增加一些清晰度(添加到@michelpm 的观点)+function(){}();-function(){}();也可以工作,因为+-可以是一元运算符。然而!更可取,因为它只是一个一元运算符,而 + 和 - 既可以是二元运算符,也可以是一元运算符。
2021-05-04 07:20:53
哇,这让我很尴尬,谢谢@valid很遗憾 Stack Overflow 不允许在 5 分钟后编辑评论。那个值得删除和修复。
2021-05-06 07:20:53

它只是让 JavaScript 解析器将其解析为一个表达式,这是执行它所必需的。

这可能就是动机。但是生成的表达式的行为仍然与任何表达式 with!一样。
2021-04-18 07:20:53
@Matthew:我不能代表 gaoshan88,但看起来他对动机很感兴趣,因为他(正确地)将其与另一种编写自执行函数的常见方式进行了比较。
2021-05-05 07:20:53

我试过了,它返回true。函数返回undefined,并且!undefined为真。

!function(){}();
^          ^ ^
C          A  B
  • A.function(){}是一个空的匿名函数
  • B.()执行函数(A),返回undefined
  • C.!否定undefined, 变成true

我认为他们将这个技巧用于代码高尔夫或混淆代码。实际使用它是一种不好的做法

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