匿名函数声明上的语法错误,但在有效语句之后不会

时间:2013-01-30 18:40:34

标签: javascript

我只是花了很长时间在承诺中挖掘回调,想知道为什么没有调用某些回调。最后问题是声明不正确,而不是

       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");
        };

无论Promise的实施细节如何,归结为一件事:

function(){};//throws SyntaxError
"something valid, or function call", function(){};//no error

我希望有人向我解释一下。为什么首先抛出SyntaxError而后者有效(至少在浏览器控制台中)?它似乎声明了匿名函数。 当我尝试

时会发生同样的事情
eval("function(){};//throws SyntaxError")
eval("'lala',function(){};//no error")

所以有人可以解释为什么第一个无效而后者是什么?

2 个答案:

答案 0 :(得分:1)

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

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

因此:

function myFunction() {
  // ...
}

是一个函数声明语句。这样:

5 + function() {};

是一个表达式语句(一个愚蠢的语句,但JavaScript就可以了)。同样,导致无错误的示例是使用逗号运算符的表达式:

"lala", function() {};

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

答案 1 :(得分:0)

您的原始代码无效,因为正如您所知,第二个函数未作为参数传递 - 您将关闭的paren放在函数之前。它没有引起任何错误,因为JavaScript将其识别为函数表达式。您对逗号运算符的使用告诉JavaScript,期望下一个语句是表达式。

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

语句'lala',function(){}包含一个表达式('lala'),后跟一个运算符(,),后跟一个函数表达式。此陈述类似:0,function(){}Promise.when(...).then(...)也是一个有效的表达式,因此Promise.when(...).then(...),function(){}的工作原理相同。