1

編集: 彼自身の言葉で: https://twitter.com/fogus/status/393058344413302784

Michael Fogus の「Functional JavaScript」を読んでいて、第 5 章の冒頭でこのリストに出くわしました。

function dispatch(/* funs */) {
    var funs = _.toArray(arguments);
    var size = funs.length;

    return function(target /*, args */) {
        var ret = undefined; // <----------------------------------- ??
        var args = _.rest(arguments);

        for (var funIndex = 0; funIndex < size; funIndex++) {
            var fun = funs[funIndex];
            ret = fun.apply(fun, construct(target, args));

            if (existy(ret)) return ret;
        }

        return ret;
     };
}

もしこれが間違いでなければ、なぜ彼は明示的に と定義retしたのundefinedですか? そして、これを行うより一般的な理由は何ですか?

前もって感謝します。

4

3 に答える 3

2

あなたの質問に対する簡単な答えは、物事をより明確にすることです。私は著者ではないため、著者が定義した理由については保証できませんvar ret = undefined;。ただし、何かを教えているときに明確にすることが良い考えである理由を説明することはできます。特に誰かにコーディングを教えているときは。

私のお気に入りの記事の 1 つは、学習可能なプログラミングに関する Bret Victor の有名なブログ投稿です (余談ですが、必ず読んでください - 私は断言します)。このブログ投稿で、ブレットは、人々が抽象的な概念よりも具体的な例をよく理解する方法について説明しています。したがって、明確にすることで、JavaScript の経験がない人でも、プログラムで何が起こっているのかを理解しやすくなります。

すべての自称 JavaScript プログラマーは、変数を宣言しても定義しないと、変数が変数になることを知っている必要がありundefinedます (考えてみれば明らかです)。したがって、著者が書いたvar ret = undefined;か、単にvar ret;. ただし、前者はより具体的で、初心者にとってより簡単に理解できます。

undefinedただし、これは JavaScript の予約語ではないことに注意してください。したがって、undefined実際にはそうではないかもしれないという変数を作成できますundefined。上記のコードのコンテキストでは、実際には完全undefinedではない可能性があります。undefinedのレキシカル環境が見えないので、確かなことはわかりませんdispatch。それにもかかわらず、おそらくそうでなければなりませんundefined

ret上記の問題を考慮すると、として宣言する方が曖昧さが減り、より明示的になりvar ret = void 0;ます。JavaScriptのvoid演算子は式を取り、評価結果は になりundefinedます。したがってvoid expression、常に と評価されundefinedます。var ret;ただし、特定のコンテキストでは、すべての正気な JavaScript プログラマーが使用するものを単純に使用する方が、混乱が少なく、あいまいさが少なくなります。

もちろん、これは著者の決定を擁護するための私の説明にすぎません。より決定的な答えについては、著者自身に尋ねる必要があります。

于 2013-10-23T14:41:41.617 に答える
2

値がまだ定義されていないこと、または値を明示的undefined. つまり、彼は値を として定義していますundefined

しかし、そうする構文上の理由はありません。var foo;それらが関数の先頭にある場合は同じことをvar foo = undefined;行い、後者を他の場所で使用すると、既存の変数の値が破棄される可能性があります。

于 2013-10-23T14:27:06.237 に答える
0

その特定のケースでは、技術的な理由はわかりません。それは、彼の習慣または習慣である可能性があります。確かに、彼は次のように宣言できretます。

var ret;

その特定のケースでは、変数がローカルであるため、十分です。また、変数の初期値を何にも使用しません(ループでは、変数を割り当てるだけです)。

ただし、より複雑な環境では、変数を明示的に に設定するundefinedことをお勧めします。varはブロック スコープ変数を宣言しないため、巨大なモジュールまたは本体関数がある場合、またはチームで作業している場合、または Web 上で公開する前に異なるスクリプトを組み合わせている場合は、同じ変数の名前を再利用する可能性があります。 2 回、おそらく 2 つの異なる範囲で。その場合、値を明示的に設定しないと、以前に設定した値が再利用されます。明確にするために:

var ret = 10;
/* doing something with ret */

/* in the same scope, some lines above: */

if (someCondition) {
   var ret;
   console.log(ret); // 10, not `undefined`
}

これは、巻き上げ: 変数宣言が上に移動され、代入だけが残っているために発生しています。ブロックには割り当てがなく、変数は既に宣言されているため、ifそこの宣言は単純に削除されます。

次に、同じコードをvar ret = 10最初に指定しないと、undefined次のようになることに注意してください。これが、エラーが発生しやすい理由です。

于 2013-10-23T14:30:14.033 に答える