为什么这个JavaScript函数返回';2';?

为什么这个JavaScript函数返回';2';?,javascript,Javascript,我遇到了这个奇怪的JavaScript函数: (function f(){ function f(){ return 1; } return f(); function f(){ return 2; } })(); 出于某种原因,它返回2。我认为它会使浏览器崩溃(即递归) 有人能解释这种行为吗?函数声明被挂起,因此它最终看起来像这样: (function f() { function f() { return 1; } function f() { re

我遇到了这个奇怪的JavaScript函数:

(function f(){
    function f(){ return 1; }
    return f();
    function f(){ return 2; }
})();
出于某种原因,它返回2。我认为它会使浏览器崩溃(即递归)


有人能解释这种行为吗?

函数声明被挂起,因此它最终看起来像这样:

(function f() {
    function f() { return 1; }
    function f() { return 2; }
    return f();
})();
(function f() {
    var f = function f() { return 1; };
    var f = function f() { return 2; };
    return f();
})();
这是这样的:

(function f() {
    function f() { return 1; }
    function f() { return 2; }
    return f();
})();
(function f() {
    var f = function f() { return 1; };
    var f = function f() { return 2; };
    return f();
})();
这相当于:

(function f() {
    var f = function f() { return 1; };
    f = function f() { return 2; };
    return f();
})();
(function f() {
    var f = function f() { return 2; };
    return f();
})();
这相当于:

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

与外部代码相比,更严格范围内的
f
更受欢迎。

请解释为什么有人会编写这种模糊、难以理解的代码?我不知道这是不是复制品。当然,它们都与提升有关,但别这样,真的吗?问题是不同的。“最好把所有的问题都结束……”达菲莫很遗憾,这实际上是一个我弄错的面试问题。。我同意你的看法。哇!这是一个惊人的快速回答!!谢谢minitech。我得绕着它转。再次感谢。“与外部范围相比,更紧范围内的f更可取。”实际上没有外部
f
。函数表达式的名称仅在函数内部可用,但会被其内部的新函数定义覆盖。