这是我在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获取了undefined值,为什么会这样?由于函数是全局范围的,它怎么不接受前面的 var 关键字?
修改
现在我基本了解发生了什么事情,功能栏中的var foo
将获得最重要的因为var关键字而被提升,但它会被提升没有值它已被分配。
答案 0 :(得分:12)
在var
语句中,它有两个部分 - 实际声明:
var foo //;
...和分配,这是可选的:
= 1234567890;
如果没有完成任务,变量(如果尚未定义)默认为undefined
。
变量声明部分移动到当前作用域的顶部(函数的开头),但不是实际作业(因此它等同于以下内容):
var foo = "This is a global variable.";
var bar = function() {
var foo; // undefined
alert(foo); // yes, it's undefined
foo = "Value has been modified"; // modify local, not global
}
bar();
alert(foo); // the global one
函数创建自己的范围 - 例如,请执行以下操作:
var test = function ()
{ var bar = 1;
console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined
答案 1 :(得分:3)
通过使用var
,您告诉引擎使用名为foo的本地变量,隐藏全局变量。
您在alert
上未定义的原因是,使用var
会影响整个范围,而不仅仅是从那时起。你可以写:
var foo;
alert(foo);
foo = "Value has been modified";
答案 2 :(得分:3)
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
。