变量:局部范围、全局范围还是JavaScript引擎?
在学习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 =
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
。