Javascript 为什么函数中未定义此变量?

Javascript 为什么函数中未定义此变量?,javascript,global-variables,Javascript,Global Variables,我有示例代码: var t=20; 功能测试(){ 控制台日志(t); var t=100; } test()t是全局和局部的 当你在一个函数中时,有一个叫做范围的东西。这意味着您可以使用与全局变量相同的名称声明变量,而它们实际上将完全不同。现在请注意您放置的位置console.log()。如果您没有在函数中标记变量t,您将记录20,但是您这样做了,函数与函数的t有关。但是你是在声明t之前登录的 var t=20; 函数测试(){ 控制台日志(t); } test()一个变量的范围就是你看到

我有示例代码:

var t=20;
功能测试(){
控制台日志(t);
var t=100;
}

test()
t
是全局和局部的

当你在一个函数中时,有一个叫做
范围的东西。这意味着您可以使用与全局变量相同的名称声明变量,而它们实际上将完全不同。现在请注意您放置的位置
console.log()
。如果您没有在函数中标记变量
t
,您将记录20,但是您这样做了,函数与函数的t有关。但是你是在声明t之前登录的

var t=20;
函数测试(){
控制台日志(t);
}

test()一个变量的范围就是你看到这个的原因。从:

无功提升 由于变量声明(以及一般声明)是在执行任何代码之前处理的,在代码中的任何位置声明变量等同于在顶部声明它。这也意味着变量可以在声明之前就被使用。这种行为称为“提升”,因为变量声明似乎被移动到函数或全局代码的顶部

JavaScript中的变量是函数范围的,这意味着它们只存在于函数中。由于变量声明是在执行任何代码之前处理的,因此声明它们是封闭函数作用域的开始。这种“预处理”被称为“提升”,因为声明被提升到封闭功能范围的开头。由于您在函数中重新声明了
t
,因此它在函数的开头声明(因为变量是函数作用域),与此等效:

var t = 20;
function test () {
    var t;
    console.log(t);
    t = 100;
}
test();
由于
t
在您在日志记录后分配值之前从未被赋予值,因此它是
未定义的
。解决方案是删除
var
重新声明。因此,在函数中看不到变量的声明,也不会挂起任何内容


请注意,此提升过程与您可以在定义函数声明之前使用函数声明的原因相同:

foo()//日志“foo call!”
函数foo(){
log(“foo-called!”);
}
来自:

因为变量声明(以及一般的声明)是在执行任何代码之前处理的,所以在代码中的任何位置声明变量就相当于在顶部声明它。这也意味着变量可以在声明之前就被使用。这种行为称为“提升”,因为变量声明似乎被移动到函数或全局代码的顶部

这意味着您的函数对新
t
变量的声明将在函数打开时有效执行。这会立即将“全局”
t
变量与局部变量混淆。但是,为新的
t
变量设置值的代码行直到您登录到控制台后才会执行。因此,默认值为
未定义


我承认,在本例中,JavaScript可能不是最直观的特性。但同时,它强调了代码清晰性的重要性。如果两个变量的名称相同,甚至试图在同一范围内访问,都可能会导致bug。最好给它们起不同的名字。

从函数内部的
t
中删除
var
。Darn。我刚刚意识到我们基本上使用了相同的来源和报价。。。很抱歉…@AndrewLi:这不是一场比赛,一个好答案就是一个好答案:)