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

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

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

!function(){}();

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

(function(){})();

但是……这是怎么回事?

【问题讨论】:

    标签: javascript


    【解决方案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(){}())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2018-03-01
      • 1970-01-01
      相关资源
      最近更新 更多