【问题标题】:How does JavaScript resolve this reference?JavaScript 如何解析这个引用?
【发布时间】:2013-03-24 19:44:46
【问题描述】:

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

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 的第二次引用引用该函数?

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

【问题讨论】:

    标签: javascript recursion compiler-construction scope


    【解决方案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.

    所以当函数定义中引用消费者时,变量已经被声明了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-29
      • 2012-09-19
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      相关资源
      最近更新 更多