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块中。如果在执行代码时甚至没有分配原始消费者,那么对消费者的引用如何有效?我知道函数将范围推到顶部,但是对于分配给变量的函数表达式也是如此吗?

是否可以创建一个场景,其中函数通过分配给它的变量引用自己,并且该引用尚未有效?consumer当该引用是尚未完成定义的函数的一部分时,javascript如何进行第二次引用来引用该函数?

这是否等同于递归中使用的引用?如果是这样,编译器如何评估它们是否有效?

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 回答