0

内部で、コンパイラがこの参照をどのように解決するかに興味があります。このコードがあるとしましょう:

function makeConsumer(run_priority,run_object) {
        var consumer = function(last_run_action) {
                if(!!last_run_action) {
                       // do something
                } else {
                        var next_to_load = run_priority.shift();
                        next_to_load.consume = consumer;
                        run_load_script(next_to_load,run_object);
                }
        };
        return consumer;
}

上部にへの参照がありconsumer、関数の定義が完了する前に、最後のブロックで別の参照がconsumer発生します。elseコードの実行時に元のコンシューマーが割り当てられていない場合、このコンシューマーへの参照はどのように有効ですか?関数がスコープを一番上にプッシュすることは理解していますが、これは変数に割り当てられた関数式にも当てはまりますか?

関数が割り当てられた変数を介してそれ自体を参照し、その参照がまだ有効でないシナリオを作成することは可能ですか?その参照が定義されていない関数の一部である場合、 javascriptはどのようconsumerにして関数を参照する2番目の参照を作成しますか?

これは、再帰で使用される参照と同等ですか?もしそうなら、それらはコンパイラによってどのよう有効であると評価されますか?

4

1 に答える 1

1

Javascript変数宣言は一番上に持ち上げられます。したがって、これらの変数はすべて、どこかで参照される前に「存在」します。したがって、あなたの例はこれと同等です:

function makeConsumer(run_priority,run_object) {
        var consumer; 
        consumer= function(last_run_action) {
                var next_to_load;
                if(!!last_run_action) {
                       // do something
                } else {
                        next_to_load = run_priority.shift();
                        next_to_load.consume = consumer;
                        run_load_script(next_to_load,run_object);
                }
        };
        return consumer;
}

この質問では、巻き上げについてさらに詳しく説明します。

したがって、関数定義でコンシューマーが参照されている場合、変数はすでに宣言されています。

関数が実行されるまで、変数も評価されません。したがって、この場合、関数は、関数が実際に実行されるまで、コンシューマーが何であるかを知る必要はありません(これは例には示されていません)。

于 2013-03-24T19:51:16.603 に答える