Javascript 语句求值顺序

Javascript 语句求值顺序,javascript,Javascript,我遇到了!函数(){}()语句。将其更改为!函数(){return true;}()我发现函数在之前调用过。我假设一个匿名函数声明首先成为一个函数表达式,然后它调用,最后一个结果在逻辑上被否定。我的假设是否正确,为什么语句按此顺序计算?要否定某些x,您需要知道这个x是什么。不能否定表达式,只能否定该表达式的结果 换句话说:你不能说“给我‘将x设置为y’的负值’”!(x=y)(好吧,你可以用JS写这个,但那是另一个表达式),但是你可以说“给我‘x等于y吗?’结果的负数”!(x==y) 这种方法也会

我遇到了
!函数(){}()语句。将其更改为
!函数(){return true;}()我发现函数在
之前调用过。我假设一个匿名函数声明首先成为一个函数表达式,然后它调用,最后一个结果在逻辑上被否定。我的假设是否正确,为什么语句按此顺序计算?

要否定某些
x
,您需要知道这个
x
是什么。不能否定表达式,只能否定该表达式的结果

换句话说:你不能说“给我‘将x设置为y’的负值’”
!(x=y)
(好吧,你可以用JS写这个,但那是另一个表达式),但是你可以说“给我‘x等于y吗?’结果的负数”
!(x==y)

这种方法也会发生同样的情况。因为你调用它(使用括号),它必须首先检查结果,然后才能否定它

编辑:

因为这似乎让人困惑:使用括号告诉JavaScript在函数定义之后调用该函数。试试这个:
var test=function(){return'hello';}
test现在是函数本身,运行
test()
将返回
hello
(也称为括号,使JS调用函数)


当您编写
var test=function(){return'hello';}()
时,您现在告诉JS立即调用该函数,该函数产生的结果应该是
test
的值。运行此命令将使
测试
具有值
'hello'

是一个运算符,将其放在函数或变量前面将使用rhs的值并对其求反。因此,只要()就可以从表达式函数执行;这将被调用,并且该值将被否定。因此,如果您有
console.log(function(){return true;}())
将记录
false
console.log(function(){return false;}())
将记录
true
console.log(function(){}())
是否会记录
true
还有什么其他顺序是有意义的?@Nilesh初始语句不在console.log()函数中,它会起作用。如果我把它放在浏览器控制台中,它会返回true,另一方面
function(){return true;}()
会抱怨SyntaxError。你能解释一下为什么会这样吗?我不明白你的假设和观察到的行为偏离了什么?两者都是正确的:函数在结果被否定之前被调用。可能的重复(我本来会关闭它,但已经投票不清楚)谢谢你的回答。你关于否定的解释对我来说很有意义,但仍然不清楚为什么
function(){}()调用。据我所知,这是一个带括号的函数声明,与
(function(){})相反这里有一个函数表达式。不,
function(){}
是一个函数声明。后面的
()
告诉Javascript调用该函数
function(){}()
(function(){})(
之间有什么区别?前者在控制台中抛出一个SyntaxError。请参阅我更新的注释。你不能单独使用前一个,因为它是无效的。但是,您可以编写
(函数(){})()因为在调用itI之前,您会强制JS首先计算
函数(){}
(这是一个有效的函数),如果您只是在没有任何上下文的情况下抛出一个函数定义,JS将假定它不知道该做什么。但是,如果您给它一个表达式(比如:调用该函数,或者使test成为该函数的结果),它就可以使用该表达式