Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数可以';不能访问全局变量?为什么?_Javascript - Fatal编程技术网

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在这些情况下,最好简单地在答案中添加一条注释,让对方知道他们可能想要编辑答案,但你永远不应该进行更改代码工作方式的编辑。我这样做是因为我的答案已经解释了提升,所以
未定义的
应该在答案的这一点上理解。真正重要的是
窗口。测试部分。