【问题标题】:what does !function in Javascript mean? [duplicate]Javascript 中的 !function 是什么意思? [复制]
【发布时间】:2012-03-05 06:06:22
【问题描述】:

很抱歉发布此内容,但 !function 无法通过 Google 搜索,而且我在我的 JavaScript 代码中没有找到它。

以下是 Twitter 的使用方式:

<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://google.com" data-text="Google says">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>

来自https://twitter.com/about/resources/buttons#

【问题讨论】:

    标签: javascript


    【解决方案1】:

    他们否定结果,而不是函数本身:

    !function( x ){ return x }( true );
    !true
    false
    

    实际上,它是一种略微压缩的形式:

    (function(){}())
    

    因为它需要少 1 个字符。需要它的原因是您不能直接调用函数声明,例如这是无效的:

    function(){}()
    

    但在开头添加 ! 会将其变为函数 expression 并使其工作。

    【讨论】:

    • 有趣的技术...
    • “否定结果”具有误导性,@Twisol 的回答更准确
    • @ŠimeVidas -- 我感觉这是生成的代码,用于寻找自调用函数模式,因为它确实节省了 1 个字符 :)
    • @Jonz -- 是的,它会在扔掉它之前对其进行评估,而不是像一个昂贵的操作。它还可以防止代码中的错误基本上计算为:(function(){})()(function(){})()——中间缺少;意味着第二个函数被传递给第一个函数的结果。通常不需要的行为会导致错误或非常奇怪的行为。 ! 或任何二进制操作都可以防止这种情况发生
    • @downeyt ! 没有两个含义。当 JS 运行时看到 ! 时,它知道它只能表示(因为 ! 只有一个含义)逻辑否定,因此,JS 运行时明白你只能否定一个表达式,而不是一个语句,所以指令的其余部分被视为这样。在这种用法中,表达式的结果无关紧要并被丢弃。没有双重含义。
    【解决方案2】:

    它是self-invoking anonymous function的简写或替代:

    (function(){
      // code
    })();
    

    可以写成:

    !function(){
      // code
    }();
    

    您也可以使用+ 代替!

    如果你只是这样做:

    function(){
      // code
    }();
    

    这会产生问题,这就是为什么你需要在它之前添加!,这会将函数声明变成函数表达式

    Quoting docs, section 12.4:

    ExpressionStatement 不能以 function 关键字开头,因为 这可能会使 FunctionDeclaration 变得模棱两可。

    为了更好地理解这个概念,您应该查看:

    【讨论】:

    • 有趣。自调用匿名函数何时有用?和简单的执行里面的语句有什么区别?
    • 我明白了。谢谢。如果 Javascript 支持仅使用大括号(如在 C++ 中)进行作用域,那就太好了
    • @netvope ECMAScript 6(又名 ES 2015)确实支持带有 letconst 声明的块级范围。
    【解决方案3】:

    它通常用于解决 JavaScript 语法中的一个怪癖。这给出了一个语法错误:

    function() {
    }();
    

    它被读作函数声明(如function foo () {}),而不是函数表达式。所以添加!在它之前,或者用括号括起来,强制解析器理解它是一个表达式。

    【讨论】:

    • 这不是语法的怪癖。这只是语法。
    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 2012-07-04
    • 2016-02-14
    • 2013-08-25
    • 2018-02-21
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多