我对编译器如何在内部结构中解析此引用感兴趣。假设我们有这个代码:
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
的第二个引用引用该函数,当该引用是尚未完成定义的函数的一部分时?
这相当于递归中使用的引用吗?如果是这样,编译器如何评估他们是否有效?
答案 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;
}
还有更多内容
因此,当在函数定义中引用consumer时,该变量已经被声明。
在函数运行之前,也不会评估变量。所以在这种情况下,在函数实际运行之前,函数不必知道消费者是什么(在你的例子中没有显示)。