javascript:创建全局变量的局部作用域在设置它之前取消定义它

javascript:创建全局变量的局部作用域在设置它之前取消定义它,javascript,scope,closures,local,undefined,Javascript,Scope,Closures,Local,Undefined,我不理解这种行为: var a = 1; console.log('a is undefined1:', a == undefined); var a; //iterate selected jQuery elements: jQuery.each(this, function(index, htmlElement) { console.log('a is undefined2:', a == undefined); var a; 返回: a未定义1:错误 a未定义2:真 如

我不理解这种行为:

var a = 1;
console.log('a is undefined1:', a == undefined);
var a;

//iterate selected jQuery elements:
jQuery.each(this, function(index, htmlElement) {
    console.log('a is undefined2:', a == undefined);
    var a;
返回
a未定义1:错误
a未定义2:真

如果最后一行(var a;)被注释掉,则返回该行:
a未定义1:错误
a未定义2:错误

我总是期望后者的输出。我不知道什么


非常感谢

var a
放入一个函数中会创建一个不同的
a
变量,该变量的作用域为该函数

因为您没有给它赋值,所以它是未定义的

当您注释掉它时,您正在测试值为1的外部
a


变量被提升。无论您在函数中的何处使用
var foo
,该函数的
foo
仍然适用于整个函数。

使用
var
在函数中声明变量会在整个函数上创建具有作用域的局部副本(新变量)-在声明之前是否使用它并不重要

不要在没有
var
的情况下声明变量


如果要访问golobal变量,并且您有同名的局部变量,可以使用
window.foo

aha访问全局
foo
变量!提升是一个神奇的词。从另一个堆栈溢出中找到此。谢谢