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(),并且从未被调用。我很惊讶为什么最后一个()后面的函数没有错误哦!你的问题是为什么你的第二个承诺代码不会导致语法错误?是的。。。也许用间接的方式表达。。。但这就是问题所在