! javascript中的前置函数? [复制]

Posted

技术标签:

【中文标题】! javascript中的前置函数? [复制]【英文标题】:! preceding function in javascript? [duplicate] 【发布时间】:2011-07-22 07:26:31 【问题描述】:

可能重复:What does the exclamation mark do before the function?

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

!function()();

前面的感叹号是干什么用的?我认为它的功能与以下内容相同:

(function())();

但是……这是怎么回事?

【问题讨论】:

【参考方案1】:

前面的!接受不可解析的语句,让JS引擎解析,然后返回true。

function()();
SyntaxError: Unexpected token (

!function()();
>>true

【讨论】:

这太具有误导性了,它不会使任何东西可解析,它会使函数声明被解析为一个表达式,它对函数本身求值,从而允许调用它。 我其实认为“不可解析”是准确的——js vm不会解析第一个例子。 @JeffHykin 你的评论很有趣。但是,我会指出它应该说“一元”;) 为了增加一些清晰度(增加@michelpm 的观点)+function()();-function()(); 也可以工作,因为+- 可以是一元运算符。不过! 更可取,因为它只是一元运算符,而 + 和 - 既可以是二元运算符,也可以是一元运算符。 哇,这让我很尴尬,谢谢@valid。遗憾的是 Stack Overflow 不允许在 5 分钟后编辑 cmets。那个值得删除和修复。【参考方案2】:

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

【讨论】:

这可能是动机。但结果表达式的行为仍与任何带有 ! 的表达式一样。 @Matthew:我不能代表 gaoshan88,但看起来他对动机很感兴趣,因为他(正确地)将其与另一种编写自执行函数的常用方法进行了比较。【参考方案3】:

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

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

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

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

【讨论】:

以上是关于! javascript中的前置函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

深入理解javascript的作用域--函数声明为什么会前置

在 javascript 中,当你 new() 一个函数时会发生啥? [复制]

Javascript 中的 (function e(t,n,r) ...) 是啥? [复制]

前置函数中的对象类型错误

JavaScript函数创建

javascript函数中的()和有啥区别? [复制]