!function() { return false; } ()
我知道你为什么会写这样的东西,但我对它的工作方式有疑问。据我了解,感叹号做了两件事:
- 它作用于
function() { return false; }
,把它变成一个表达式 - 它还作用于执行函数的结果,因此整行计算为
true
所以我的问题是:
- 这是正确的解释吗?
- 如果它是正确的,那么既然
()
比 绑定得更紧密!
,那么第一部分(函数本身变为表达式)是如何发生的?为什么感叹号没有作用于整行?
!function() { return false; } ()
我知道你为什么会写这样的东西,但我对它的工作方式有疑问。据我了解,感叹号做了两件事:
function() { return false; }
,把它变成一个表达式true
所以我的问题是:
()
比 绑定得更紧密!
,那么第一部分(函数本身变为表达式)是如何发生的?为什么感叹号没有作用于整行?根据运算符优先级,function
声明(它是 的简写new Function
)将首先发生,函数调用()
将发生在第二个,而否定!
将发生在最后。
为清楚起见进行编辑:您可以将这一行重写为这样来完成同样的事情:
// 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 的建议查看优先级,您会看到函数调用比否定运算符绑定得更紧密,因此整个 like 被评估为
! ((function(){})());
或者类似的,也许更易读的版本:
var f = function(){ ... };
! (f());