1

一部のコールバックが呼び出されない理由を疑問に思って、コールバックを掘り下げるのに長い時間を費やしています。結局のところ、問題は、ではなく、誤った宣言にありました

       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の実装の詳細に関係なく、要約すると次の1つになります。

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」は、これら2つの式のどちらの先頭にも表示されないため、パーサーは関数の名前を要求しません。

于 2013-01-30T18:48:21.433 に答える
0

ご存知のように、2番目の関数がパラメーターとして渡されなかったため、元のコードは機能していませんでした。関数の前に終了パラメーターを配置しました。JavaScriptが関数式として認識したため、エラーは発生していませんでした。コンマ演算子を使用すると、JavaScriptに次のステートメントが式になることを期待するように指示されました。

関数宣言は匿名にすることはできませんが、関数は匿名にすることができます。スタンドアロンの無名関数は、JavaScriptの識別子がない関数宣言のように見えます。ただし、JavaScriptは演算子と組み合わせて、無名関数を演算子のオペランド式として扱います。

ステートメント'lala',function(){}は、式('lala')、演算子(,)、関数式で構成されます。このステートメントは似ています:0,function(){}Promise.when(...).then(...)も有効な式なので、Promise.when(...).then(...),function(){}まったく同じように機能します。

于 2013-01-30T18:48:30.367 に答える