! 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() 一个函数时会发生啥? [复制]