gpt4 book ai didi

javascript - 为什么 userid 不更改全局 userid ,它从未使用 userid 函数在 foo 内声明

转载 作者:行者123 更新时间:2023-11-28 14:18:38 26 4
gpt4 key购买 nike

我已将 userid 声明为全局变量,并在函数内部为 userid 赋值并声明了一个新函数 userid()但总是在内部函数声明之前返回。为什么我无法更改全局变量。

var userid = 'test1';

function foo() {
userid = 'test2';
return;
function userid() {}
}

foo();
console.log(userid);

它返回test1,但预期结果应该是test2

如果我删除这个

function userid() {}

效果很好。我知道它的 Java 脚本 Hoisting 在这里发挥作用,但为什么以及如何发挥作用?

最佳答案

在 JavaScript 中,声明为 hoisted到其封闭范围的顶部,因此当您声明函数 id 时,它会按如下方式处理:

function foo() {
function userid() {} // Even though you placed this last, it's processed first!
userid = 'test2';
return;
}
foo();
console.log(userid);

即使您没有将函数作为 foo 中的第一件事编写,它也会像您这样做一样进行处理,这意味着现在有第二个 userid 变量在本地范围内并“隐藏”全局范围。

现在,还有一种方法可以访问全局变量,那就是通过全局 window 对象:

var userid = "something";

function foo() {
// Hoisting is why we can call functions before we've declared them!
userid();
window.userid = 'test2'; // Access the global through the global object
return;
// Normally, nothing after a return is processed, but because of
// hoisting, this function declaration will be processed first.
function userid() {
console.log("hello from userid");
}
}
foo();
console.log(userid);

关于javascript - 为什么 userid 不更改全局 userid ,它从未使用 userid 函数在 foo 内声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56256883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com