JavaScript如何解析此引用?

时间:2013-03-24 19:44:47

标签: javascript recursion compiler-construction scope

我对编译器如何在内部结构中解析此引用感兴趣。假设我们有这个代码:

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的第二个引用引用该函数,当该引用是尚未完成定义的函数的一部分时?

这相当于递归中使用的引用吗?如果是这样,编译器如何评估他们是否有效?

1 个答案:

答案 0 :(得分: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;
}

提升in this question.

还有更多内容

因此,当在函数定义中引用consumer时,该变量已经被声明。

在函数运行之前,也不会评估变量。所以在这种情况下,在函数实际运行之前,函数不必知道消费者是什么(在你的例子中没有显示)。