有人可以详细解释为什么在以下函数中,返回值是1.5? javascript是从下到上解析还是有更多内容?
(function f() {
function f() { return 1; }
return f();
function f() { return 2; }
function f() { return 1.5; }
})();
答案 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
答案 2 :(得分:1)
当js解释器首先访问该函数时,它会查找所有var和函数结构(但不是匿名函数)并按照它们找到它们的顺序对它们进行调整,之后它开始从函数的开始执行代码。在你的情况下,f函数返回1.5是最后一个,所以它改变了previos 2 f functios