关于javascript:!function()的操作细节{return false; }()

Detail of operation of !function() { return false; } ()

1
!function() { return false; } ()

我知道为什么你可能写这样的东西,但我对它的工作方式有疑问。 据我所知,感叹号做了两件事:

  • 它作用于function() { return false; },将其更改为表达式
  • 它还作用于执行函数的结果,因此整行评估为true
  • 所以我的问题是:

  • 这是正确的解释吗?
  • 如果它是正确的,那么因为()!更紧密地结合,第一部分(函数本身变为表达式)是如何发生的? 为什么感叹号不会贯穿整条线?

  • 根据运算符优先级,function声明(这是new Function的简写)将首先发生,函数调用()将发生在第二个,而否定!将在最后发生。

    编辑为清晰:您可以重写这一行,以完成相同的事情:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // declare an anonymous function and assign it to the myFunc variable
    var myFunc = function () {
        return false;
    };

    // execute the function and store it's return value (false) in returnValue
    var returnValue = myFunc();

    // negate the return value (true)
    var output = !returnValue;


    1)它不会"改变"它。 当解析器通过"函数"位时它会期望一个表达式,所以"函数"被解析为(可能是匿名的)函数表达式的一部分而不是函数语句。

    2)它作用于整条线。 如果你看一下优先级,就像jbabey所建议的那样,你会看到函数调用比ifation运算符绑定得更紧,所以整个类似的被评估为

    1
    ! ((function(){})());

    或者在类似的,可能更易阅读的版本中:

    1
    2
    var f = function(){ ... };
    ! (f());