变量:局部范围、全局范围还是JavaScript引擎?

变量:局部范围、全局范围还是JavaScript引擎?,javascript,Javascript,在学习javascript的作用域时,我发现了一些有趣的东西 代码 var foo = "This is a global variable."; var bar = function() { alert(foo); foo = "Value has been modified"; } bar(); alert(foo); 这给出了你认为会得到的正常响应,但如果我改变这一行: 发件人: foo = "Value has been modified"; var foo =

在学习javascript的作用域时,我发现了一些有趣的东西

代码

var foo = "This is a global variable.";

var bar = function() {
    alert(foo);
    foo = "Value has been modified";
}

bar();
alert(foo);
这给出了你认为会得到的正常响应,但如果我改变这一行:

发件人:

foo = "Value has been modified";
var foo = "Value has been modified";
至:

foo = "Value has been modified";
var foo = "Value has been modified";

我得到了一个未定义的foo值,这是为什么?既然函数是全局范围,为什么它不接受前面的var关键字

编辑


现在我基本上了解了正在发生的事情功能栏中的
var foo
将获得最重要的,因为var关键字并被提升,但它将被提升,而没有分配值。

使用
var
,您告诉引擎使用名为foo的局部变量,隐藏全局变量

警报
中未定义的原因是使用
var
会影响整个范围,而不仅仅是从该点开始。你可以写:

var foo;
alert(foo);
foo = "Value has been modified";

var
语句中,有两部分-实际声明:

var foo //;
。。。以及作业,这是可选的:

= 1234567890;
如果未对其进行赋值,则变量(如果尚未定义)默认为
undefined


变量声明部分被移动到当前作用域的顶部(函数的开始),但不是实际赋值(因此它相当于以下内容):

函数创建自己的作用域-例如:

var test = function ()
{   var bar = 1;
    console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined

JavaScript引擎将解析您的代码并将
var
声明移动到其作用域的顶部,但您对它的字符串赋值将保持不变。解析后,下面是如何解释代码:

var foo = "This is a global variable.";    

var bar = function() {
    var foo;
    alert(foo);
    foo = "Value has been modified";
}    

bar();
alert(foo);

当它在函数顶部创建一个没有任何值的局部变量时,您的警报将显示
undefined

两个词:“我得到了一个未定义的foo值,这是为什么?”--不,您不移动var栏并不能解决此问题。可能的重复内容可能有助于阅读ECMA-262的内容,特别是。但是如果它们被提升到当前作用域的顶部,为什么不显示分配给它的值?@htmltroll:因为实际分配没有被提升,只有定义。当你说修改本地而不是全局时,你是什么意思?foo没有修改全局起始变量foo吗?因为这个功能是全球性的,我不喜欢“吊装”这个词。它推断整个语句“移动到范围的顶部”(即执行上下文)。ECMA-262所说的是首先处理变量声明,然后计算语句和表达式。因此,声明的变量在赋值之前就存在,即使使用了。@htmltroll:函数的内容在另一个作用域中-值已被修改“仅在函数内部更改
foo