请问为什么下面的函数返回值是1.5?Javascript是从下往上解析代码吗?还是还有其他原因导致这种结果?
(function f() {
function f() { return 1; }
return f();
function f() { return 2; }
function f() { return 1.5; }
})();
请问为什么下面的函数返回值是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() {
function f() { return 1; }
return f();
function f() { return 1.5; }
function f() { return 2; }
})(); //=> 2
由于变量提升,这等同于
(function f(){
var f;
f = function(){ return 1; };
f = function(){ return 2; };
f = function(){ return 1.5; };
return f();
})();
接下来,每个函数初始化都被提升了。每个变量的定义实际上是在其作用域顶部声明变量并在定义处进行赋值。1
函数初始化发生在父函数的顶部(在vars之上)。由于具有与参数或函数重名的vars声明是无操作的,因此我们得到了一些令人惊讶的结果。1