JavaScript基本概念-提升

JavaScript基本概念-提升,javascript,this,hoisting,Javascript,This,Hoisting,我使用JS已经有相当一段时间了,但是仍然在一些有着非常基本概念的地方被卡住了。 最近我遇到了一些基本的问题,我被这个问题难住了 var employeeId = 'abc123'; function foo() { employeeId = '123bcd'; return; function employeeId() {} } foo(); console.log(employeeId); O/p:abc123 有人能解释一下abc123是如何输出的吗。 这可能是

我使用JS已经有相当一段时间了,但是仍然在一些有着非常基本概念的地方被卡住了。 最近我遇到了一些基本的问题,我被这个问题难住了

var employeeId = 'abc123';

function foo() {
    employeeId = '123bcd';
    return;

    function employeeId() {}
}
foo();
console.log(employeeId);
O/p:
abc123

有人能解释一下abc123是如何输出的吗。
这可能是一个非常基本的问题,但任何帮助都将不胜感激。

这个问题都与范围界定有关。阅读更多关于@Shubham范围界定的内容,仅此一点是不够的。这也是关于函数声明提升的特性,它在这里产生了不直观的结果。
employeeId
foo
中提升。当您写入
employeeId=“123bcd”
时,它会在当前范围(foo)中搜索是否存在名为
employeeId的变量,以及是否存在已挂起的函数
employeeId
。现在,您将函数重写为一个字符串,但不返回任何内容。它到底是如何实现的<代码>函数employeeId
创建本地名称
employeeId
,与
var employeeId
相同。它以相同的名称隐藏全局变量,因此在函数内部指定给
employeeId
不会更改外部变量。这足够清楚吗?从函数内部变异外部变量是丑陋的,也不是纯粹的。我建议您阅读。纯函数可以帮助您编写更清晰的代码,而不会产生副作用。这是函数式编程的核心原则。