1

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

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

那么有人可以解释一下为什么第一个无效而后者无效吗?

4

2 回答 2

1

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

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

因此:

function myFunction() {
  // ...
}

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

5 + function() {};

是一个表达式语句(一个愚蠢的语句,但 JavaScript 没问题)。同样,没有错误的示例是带有逗号运算符的表达式:

"lala", function() {};

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

于 2013-01-30T18:48:21.433 回答
0

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

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

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

于 2013-01-30T18:48:30.367 回答