Javascript函数解析顺序

时间:2014-01-28 17:24:29

标签: javascript parsing

有人可以详细解释为什么在以下函数中,返回值是1.5? javascript是从下到上解析还是有更多内容?

    (function f() {
        function f() { return 1; }
        return f();
        function f() { return 2; }
        function f() { return 1.5; }
    })();

3 个答案:

答案 0 :(得分:4)

功能在他们所居住的范围的顶部是“hoisted”。

所以你的代码实际上是:

(function f() {
    function f() { return 1; }
    function f() { return 2; }
    function f() { return 1.5; }
    return f();
})();

QED:

(function f() {
    function f() { return 1; }
    return f();
    function f() { return 1.5; }
    function f() { return 2; }
})(); //=> 2

答案 1 :(得分:1)

jsFiddle Demo

由于吊装,这相当于

(function f(){
 var f;
 f = function(){ return 1; };
 f = function(){ return 2; };
 f = function(){ return 1.5; };
 return f();
})();

吊装可能很棘手,因为这里有两个方面。首先,提升变量定义

  

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

接下来,每个函数初始化都会被提升

  

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

1: Scope Cheatsheet MDN

答案 2 :(得分:1)

当js解释器首先访问该函数时,它会查找所有var和函数结构(但不是匿名函数)并按照它们找到它们的顺序对它们进行调整,之后它开始从函数的开始执行代码。在你的情况下,f函数返回1.5是最后一个,所以它改变了previos 2 f functios