Variable: local scope, global scope or is it the JavaScript engine?
这是我在学习JavaScript范围时发现的一些有趣的东西。
代码
1 2 3 4 5 6 7 8 9 | var foo ="This is a global variable."; var bar = function() { alert(foo); foo ="Value has been modified"; } bar(); alert(foo); |
这是您认为会得到的正常响应,但如果我更改这一行:
来自:
1 | foo ="Value has been modified"; |
到:
1 | var foo ="Value has been modified"; |
对于foo,我得到一个未定义的值,这是为什么?既然函数是全局范围,为什么它不接受前面的var关键字?
编辑
现在我基本上理解了函数栏中的
在
1 | var foo //; |
…以及任务,这是可选的:
1 | = 1234567890; |
如果没有对其进行赋值,则变量(如果尚未定义)默认为
变量声明部分被移动到当前作用域的顶部(函数的开头),而不是实际的赋值(因此它相当于以下内容):
1 2 3 4 5 6 7 8 9 10 | 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 |
函数创建自己的作用域-例如:
1 2 3 4 5 6 | var test = function () { var bar = 1; console.log(bar); // 1 }; test(); console.log(bar); // ReferenceError: bar is not defined |
javascript引擎将解析您的代码并将
1 2 3 4 5 6 7 8 9 10 | var foo ="This is a global variable."; var bar = function() { var foo; alert(foo); foo ="Value has been modified"; } bar(); alert(foo); |
由于它在函数顶部创建了一个没有任何值的局部变量,因此您的警报将显示
通过使用
在
1 2 3 | var foo; alert(foo); foo ="Value has been modified"; |