这里有一些有趣的我在
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的值,为什么是这样?由于函数是全局范围,所以它在前面不接受var关键字?
编辑
现在我了解基本上发生了什么,功能栏中的var foo将会因为var关键字而获得最大的重视,并且被挂起,但是没有赋值的情况下会被挂起.
解决方法
在一个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