Javascript 函数可以';不能访问全局变量?为什么?
我刚刚遇到这种情况:Javascript 函数可以';不能访问全局变量?为什么?,javascript,Javascript,我刚刚遇到这种情况: var测试='thing1'; 函数func(){ 控制台日志(测试); var测试=‘事情2’; 控制台日志(测试); } func()您无法获取东西1的原因是,您在测试具有本地定义的同一范围内调用测试。所有声明都位于其封闭范围的顶部,因此即使您编写了: var testing = 'thing 2'; 在第一次console.log()之后,var testing被提升并作为函数中的第一位代码进行处理,因此testing在本地声明,但尚未初始化(这将发生在行的原始位
var测试='thing1';
函数func(){
控制台日志(测试);
var测试=‘事情2’;
控制台日志(测试);
}
func()
您无法获取东西1
的原因是,您在测试
具有本地定义的同一范围内调用测试
。所有声明都位于其封闭范围的顶部,因此即使您编写了:
var testing = 'thing 2';
在第一次console.log()
之后,var testing
被提升并作为函数中的第一位代码进行处理,因此testing
在本地声明,但尚未初始化(这将发生在行的原始位置)
因此,您的代码处理如下:
var testing = 'thing 1'; // 1. Runs as soon as encountered
function func() {
var testing; // 3. testing is hoisted and declared, but still undefined
console.log(testing); // 4. undefined is logged
testing = 'thing 2'; // 5. local `testing` is now initialized
console.log(testing); // 6. local `testing` is logged "thing 2"
}
func(); // 2. func is invoked
function func() {
var testing;
console.log(testing);
testing = 'thing 2';
console.log(testing);
}
使用相同标识符(名称)的多个变量是完全可以的(但有时会令人困惑),但您必须了解的是,总是先检查较小的范围,因此在func
中,当您请求测试时,您将得到“隐藏”的本地版本该函数期间的全局值
Globals之所以称为Globals,是因为您始终可以访问它们。如果需要全局版本,则始终可以将其作为全局窗口的属性来访问:
var测试='thing1';
函数func(){
控制台日志(测试);
var测试=‘事情2’;
控制台日志(窗口测试);
}
func()代码>JavaScript将使用var
的所有变量声明提升到函数顶部。因此,您的函数的行为就像您这样编写的:
var testing = 'thing 1'; // 1. Runs as soon as encountered
function func() {
var testing; // 3. testing is hoisted and declared, but still undefined
console.log(testing); // 4. undefined is logged
testing = 'thing 2'; // 5. local `testing` is now initialized
console.log(testing); // 6. local `testing` is logged "thing 2"
}
func(); // 2. func is invoked
function func() {
var testing;
console.log(testing);
testing = 'thing 2';
console.log(testing);
}
欢迎使用javascript提升权重-自1995年以来,它与异步内容一起造成混乱。@manuell请不要编辑别人的答案,以从根本上改变它的工作方式。这不是打字错误,对此我很抱歉。我以为你想展示如何获得“第一件事”和“第二件事”,因为这正是OP想要/期望的…@manuell在这些情况下,最好简单地在答案中添加一条注释,让对方知道他们可能想要编辑答案,但你永远不应该进行更改代码工作方式的编辑。我这样做是因为我的答案已经解释了提升,所以未定义的
应该在答案的这一点上理解。真正重要的是窗口。测试部分。