上下文中,我们需要额外的括号来表示javascript函数表达式

上下文中,我们需要额外的括号来表示javascript函数表达式,javascript,function,expression,Javascript,Function,Expression,为什么/何时在函数表达式中需要额外的括号。这两段代码返回相同的结果。任何我们需要额外()的上下文 谢谢当解析器处于需要语句而不是表达式的状态时,您只需要括号(括号不是“额外的”,因为您需要它们!)。因此,如果你想:“我可以在这里开始一个if语句吗?”,如果答案是“是的,我可以”,那么你需要帕伦 原因是,当解析器需要一条语句时,如果它看到关键字function,它会假定下面是函数声明,而不是函数表达式 为了使解析器期望表达式,我们不必使用parens,任何使解析器期望表达式的标记都可以工作 例如,

为什么/何时在函数表达式中需要额外的括号。这两段代码返回相同的结果。任何我们需要额外()的上下文


谢谢

当解析器处于需要语句而不是表达式的状态时,您只需要括号(括号不是“额外的”,因为您需要它们!)。因此,如果你想:“我可以在这里开始一个
if
语句吗?”,如果答案是“是的,我可以”,那么你需要帕伦

原因是,当解析器需要一条语句时,如果它看到关键字
function
,它会假定下面是函数声明,而不是函数表达式

为了使解析器期望表达式,我们不必使用parens,任何使解析器期望表达式的标记都可以工作

例如,在
=
之后不需要它们(您的示例),因为解析器已经期望在赋值的右侧有一个表达式。类似地,属性初始值设定项中的
后面也不需要它们:

var obj = {
    foo: function() { /* ... */ }
};
…或将函数表达式作为参数传递给函数时:

foo(function() {
    /* ... */
});
…诸如此类的事情

但你在这里需要它们:

doSomething();
function() { /* ... */}();   // <== Fails

doSomething();

(函数(){/*…*/}());// 当解析器处于需要语句而不是表达式的状态时,您只需要括号(括号不是“额外的”,因为您需要它们!)。因此,如果你想:“我可以在这里开始一个
if
语句吗?”,如果答案是“是的,我可以”,那么你需要帕伦

原因是,当解析器需要一条语句时,如果它看到关键字
function
,它会假定下面是函数声明,而不是函数表达式

为了使解析器期望表达式,我们不必使用parens,任何使解析器期望表达式的标记都可以工作

例如,在
=
之后不需要它们(您的示例),因为解析器已经期望在赋值的右侧有一个表达式。类似地,属性初始值设定项中的
后面也不需要它们:

var obj = {
    foo: function() { /* ... */ }
};
…或将函数表达式作为参数传递给函数时:

foo(function() {
    /* ... */
});
…诸如此类的事情

但你在这里需要它们:

doSomething();
function() { /* ... */}();   // <== Fails

doSomething();

(函数(){/*…*/}());//通常,当您要更改操作顺序或强制将(不明确的)构造计算为表达式时。通常,当您要更改操作顺序或强制将(不明确的)构造计算为表达式时。+1,但“当解析器处于状态时…”有点不透明。我意识到在这里引用规范可能不现实,但仍然如此。我必须说我非常喜欢这个“如果
,我可以
”规则。一级教学辅助!谢谢但是,解析器不能通过注意到“}”后面有一个“()”来推断它是一个函数表达式吗?@user3124390:它不会向前看那么远,而且,如果您有
function foo(){}()这不是一个函数表达式,它是一个函数声明,后跟一对空参数(这是完全有效的,但不调用函数)。当然,它们可能不是空的,您可以这样做:
function foo(){}(function(){console.log(“Run me!”);}())
,这也是一个声明,后面跟一个与声明无关的表达式。因此,我们通过强制表达式来解决歧义。(是否完美?否:-)人类的创造从来都不是完美的:JS也不例外。)当你想让函数匿名,这样它就不能在+1之外被引用时,这不是应该使用的吗?+1,但是“当解析器处于某个状态时…”有点不透明。我意识到在这里引用规范可能不现实,但仍然如此。我必须说我非常喜欢这个“如果
,我可以
”规则。一级教学辅助!谢谢但是,解析器不能通过注意到“}”后面有一个“()”来推断它是一个函数表达式吗?@user3124390:它不会向前看那么远,而且,如果您有
function foo(){}()这不是一个函数表达式,它是一个函数声明,后跟一对空参数(这是完全有效的,但不调用函数)。当然,它们可能不是空的,您可以这样做:
function foo(){}(function(){console.log(“Run me!”);}())
,这也是一个声明,后面跟一个与声明无关的表达式。因此,我们通过强制表达式来解决歧义。(是否完美?否:-)人类的创造从来都不是完美的:JS也不例外。)当你想让一个函数匿名,这样它就不能被外部引用时,这难道不是应该使用的吗?
doSomething();
+function() { /* ... */}();  // <== Works

doSomething();
!function() { /* ... */}();  // <== Works

doSomething();
~function() { /* ... */}();  // <== Works