Javascript 匿名函数声明出现语法错误,但不是在有效语句之后

Javascript 匿名函数声明出现语法错误,但不是在有效语句之后,javascript,Javascript,我只是花了很长时间去挖掘承诺中的回调,想知道为什么有些回调没有被调用。最终的问题是错误的声明,而不是 Promise.when(null).then(function () { var p = new Promise(); p.fail(new Error("some message")); return p; }).then(function () { console.

我只是花了很长时间去挖掘承诺中的回调,想知道为什么有些回调没有被调用。最终的问题是错误的声明,而不是

       Promise.when(null).then(function () {
            var p = new Promise();
            p.fail(new Error("some message"));
            return p;
        }).then(function () {
            console.log("success");
        }, function (err) {
            console.log("failure");
        });
是的

       Promise.when(null).then(function () {
            var p = new Promise();
            p.fail(new Error("some message"));
            return p;
        }).then(function () {
            console.log("success");
        }), function (err) {
            console.log("failure");
        };
不管承诺的实施细节如何,它归结为一件事:

function(){};//throws SyntaxError
"something valid, or function call", function(){};//no error
我想找个人给我解释一下。为什么第一个抛出的是
SyntaxError
,而后者是有效的(至少在浏览器控制台中)?它似乎声明了匿名函数。 当我尝试时也会发生同样的事情

eval("function(){};//throws SyntaxError")
eval("'lala',function(){};//no error")

有人能解释一下为什么第一个是无效的,而第二个是无效的吗?

以关键字“function”开头的语句必须是有效的函数声明语句。这需要函数的名称

在表达式(或表达式语句)中,该规则是不同的;不需要名称,因为函数在该上下文中充当值。那么就不需要名字了

因此:

function myFunction() {
  // ...
}
是一个函数声明语句。这:

5 + function() {};
是一个表达式语句(一个愚蠢的语句,但JavaScript对此没有问题)。类似地,不会导致错误的示例是带有逗号运算符的表达式:

"lala", function() {};

关键字“function”不出现在这两个表达式的开头,因此解析器不坚持函数的名称。

以关键字“function”开头的语句必须是有效的函数声明语句。这需要函数的名称

在表达式(或表达式语句)中,该规则是不同的;不需要名称,因为函数在该上下文中充当值。那么就不需要名字了

因此:

function myFunction() {
  // ...
}
是一个函数声明语句。这:

5 + function() {};
是一个表达式语句(一个愚蠢的语句,但JavaScript对此没有问题)。类似地,不会导致错误的示例是带有逗号运算符的表达式:

"lala", function() {};

关键字“function”不会出现在这两个表达式的开头,因此解析器不会坚持函数的名称。

您的原始代码不起作用,因为您发现,第二个函数没有作为参数传递-您将结束参数放在函数之前。它没有引起任何错误,因为JavaScript将其识别为函数表达式。您对逗号运算符的使用让JavaScript期望下一条语句是表达式

函数声明不能匿名,但函数表达式可以匿名。独立匿名函数看起来像是JavaScript缺少标识符的函数声明。但是,结合运算符,JavaScript将匿名函数视为运算符的操作数表达式


语句
'lala',function(){}
由一个表达式(
'lala'
)和一个运算符(
)以及一个函数表达式组成。此语句类似:
0,function(){}
Promise.when(…).then(…)
也是一个有效的表达式,所以
Promise.when(…).then(…),function(){}
的工作原理是一样的。

您原来的代码不工作,因为您发现第二个函数没有作为参数传递-您将结束参数放在函数之前。它没有引起任何错误,因为JavaScript将其识别为函数表达式。您对逗号运算符的使用让JavaScript期望下一条语句是表达式

函数声明不能匿名,但函数表达式可以匿名。独立匿名函数看起来像是JavaScript缺少标识符的函数声明。但是,结合运算符,JavaScript将匿名函数视为运算符的操作数表达式


语句
'lala',function(){}
由一个表达式(
'lala'
)和一个运算符(
)以及一个函数表达式组成。此语句类似:
0,function(){}
Promise.when(…).then(…)
也是一个有效的表达式,因此
Promise.when(…).then(…),function(){}
的工作原理是一样的。

continuation.();是删除部分原始代码后留下的。我从代码片段中删除了它。但是thx,对于原始答案。继续。();是删除部分原始代码后留下的。我从代码片段中删除了它。但是thx,对于原始答案。继续。();是删除部分原始代码后留下的。我从代码片段中删除了它。实际的问题是关于函数声明/表达式澄清的第二部分,即thx。您更正的代码段都不会产生语法错误。这就是重点。后一个Promise示例是有效的,但错误处理程序实际上并没有传递给Promise.then(),并且从未被调用。我很惊讶为什么最后一个()后面的函数没有错误哦!你的问题是为什么你的第二个
承诺
代码不会导致语法错误?是的。。。也许用间接的方式表达。。。但这就是问题所在;是删除部分原始代码后留下的。我从代码片段中删除了它。实际的问题是关于函数声明/表达式澄清的第二部分,即thx。您更正的代码段都不会产生语法错误。这就是重点。后一个Promise示例是有效的,但错误处理程序实际上并没有传递给Promise.then(),并且从未被调用。我很惊讶为什么最后一个()后面的函数没有错误哦!你的问题是为什么你的第二个
承诺
代码不会导致语法错误?是的。。。也许用间接的方式表达。。。但这就是问题所在