这段JavaScript代码为什么会记录1?

3
在一次面试中,我被要求猜测以下代码片段的输出结果:

var foo = 1;
    
function bar() {
    foo = 10;
    return;
    function foo() {
    }
}

bar();

console.log(foo);

我原以为输出结果将是10,因为bar函数在重新分配foo的值后立即返回,但实际输出结果是1。这是因为函数定义中使用了相同的变量名(foo)吗?在bar内部会创建一个新的作用域用于foo变量吗?


因为bar()中的foo是定义函数,而不是来自父范围的变量。 - tarkh
foo 作为本地函数的名称被提升并覆盖了更高范围中的 var foo - Alex K.
你是对的。你已经在函数的本地作用域中重新定义了 foo。只要在函数作用域内有任何定义,全局作用域就不会受到影响。 - Jax-p
输出可能是 10。仅凭“看”代码无法确定。"fоo" === "foo" - Lain
2个回答

5

这是一个在面试中相当刻薄(并且有点毫无意义)的问题!

这确实与作用域中 barfoo 函数有关 - 没有它,它就会按你的期望执行。

 var foo = 1;
    
function bar() {
    foo = 10;
    return;
    
}

bar();

console.log(foo);

由于“提升”(hoisting)的原因-函数声明在 bar 内部被提升到函数 bar 的开头作为新变量,由于 JavaScript 允许你在运行时更改类型的特性,它允许你将它(而不是全局的)foo 设置为10。
本质上它与以下代码相同:

 var foo = 1;
    
function bar() {
    var foo;
    foo = 10;
}

bar();

console.log(foo);


3

bar 内的函数声明创建了一个新的本地名称 foo,它遮蔽了外部的那个。实际上,function foo() {} 行被提升到函数的顶部。您可以在这里看到:

function bar() {
    console.log(foo);
    foo = 10;
    console.log(foo);
    return;
    function foo() {}
}

bar();

所以foo = 10修改的是本地foo名称,而不是全局的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接