4

これは正しい結果を生成するために実行され、Chrome デバッガーは例外がなかったことを示します。

var x = new Foo().bar().baz();

しかし、これはスペースに消えて完了せず、Chrome デバッガーは、bar() が正しく実行されたにもかかわらず、「typeerror」例外をスローし、baz() を呼び出そうとしても指定された関数に到達しないと言います。

var x = new Foo();
x = x.bar().baz();

機能的には同じように見えます。なぜ彼らは異なる振る舞いをするのですか?

4

3 に答える 3

2

括弧が必要です:

var x = (new Foo()).bar().baz();

それ以外の場合、newステートメントは の戻り値に適用され、Foo().bar().baz()インスタンス化が試行される前にすべてが実行されます。

更新: 彼らが言うように、これは間違っていることに気がつきました。でもコメントは面白いと思うので、回答を削除しません。

于 2013-11-01T04:45:22.453 に答える
0

私自身の質問に答えました-そして、少年は愚かだと感じますか! ごめん。「なぜ彼らは異なる振る舞いをするのですか?」に対する短い答え- 彼らはそうではありません.

他の人に同じことを試してもらい、結果が異なることに動機付けられて、私は自分の問題をさらに熟考し、最終的に...タイプミスを発見しました! 私が「baz()」としてモデル化した関数の元の名前は、キャメルケースの冗長な文字列であり、間違った大文字のエル ('l') が入り込んでいました。

デバッガーはニシンであることが判明しました。(実行をトレースしてエラー メッセージを表示するためだけに使用しましたが、評価や環境のシミュレーションには使用しませんでした。)

エラー メッセージがもっと単純だったら、本当の問題をもっと早く発見できたはずです。Chrome デバッガーは「typeerror」のスローを報告し、Firebug は「無効なスコープ変数」を報告しましたが、どちらも関数名のタイプミスを探す手がかりにはなりませんでした。

教訓: 真夜中以降に質問を投稿しないでください:-)

于 2013-11-01T18:51:20.590 に答える