Javascript函数解析顺序

Javascript函数解析顺序,javascript,parsing,Javascript,Parsing,有人能详细解释一下为什么在下面的函数中,返回值是1.5吗?javascript是自下而上解析还是有更多的解析 (function f() { function f() { return 1; } return f(); function f() { return 2; } function f() { return 1.5; } })(); 函数位于其所在作用域的顶部 因此,您的代码实际上是: (function

有人能详细解释一下为什么在下面的函数中,返回值是1.5吗?javascript是自下而上解析还是有更多的解析

    (function f() {
        function f() { return 1; }
        return f();
        function f() { return 2; }
        function f() { return 1.5; }
    })();
函数位于其所在作用域的顶部

因此,您的代码实际上是:

(function f() {
    function f() { return 1; }
    function f() { return 2; }
    function f() { return 1.5; }
    return f();
})();
量化宽松:

由于吊装,这相当于

(function f(){
 var f;
 f = function(){ return 1; };
 f = function(){ return 2; };
 f = function(){ return 1.5; };
 return f();
})();
吊装可能很棘手,因为这里有两个方面。首先,提升变量定义

变量的每个定义实际上都是变量在其作用域顶部的声明,以及定义所在位置的赋值。1

接下来,提升每个功能初始化

函数初始化发生在父函数的顶部(变量上方)。由于名称已经作为参数或函数存在的vars声明不是ops,因此我们得到了一些令人惊讶的结果。1


1:

当js interprer首先访问函数时,它会查找所有变量和函数构造(但不是匿名函数),并按照找到它们的顺序进行排序,然后从函数的开头开始执行代码。在您的例子中,返回1.5的f函数是最后一个,因此它会验证previos 2 f函数

此行为称为提升。谷歌吧!一个我学到的答案在《时代》杂志上添加了一个例子,读到“也许你会发现@GrijeshChauhan很有帮助”没关系,我并不是为了投票才加入的;)@然后kooilnc添加了一些理论,定义了什么是托管。。我觉得它是不完整的,如果有新的人…这就是为什么我添加了一个链接()。简而言之,因为Ben Cherry解释得很好。@kooilnc谢谢kooilnc,,我没有读过它(因为我不是web开发人员),所以我会读它…我从中学到了很多脚本。。。编写脚本并尝试回答问题@SO。有很多优秀的在线资源可以免费学习更多信息,比如或。我试过阅读编程方面的书籍,但大多数时候它们让我感到厌烦,或者在我读完这本书并忘记它之前,我(重新)编写了示例。实际上,你们两个都没有定义所谓的“提升”吗??但是+因为我得到了它。@GrijeshChauhan-有关提升的更多信息,请参阅编辑。
(function f(){
 var f;
 f = function(){ return 1; };
 f = function(){ return 2; };
 f = function(){ return 1.5; };
 return f();
})();