关于全局变量和局部变量的一句简单的定义: 在函数外声明的变量都为全局变量, 在函数内声明的为局部变量.
一, 局部变量和全局变量重名会覆盖全局变量
- var a = 1;
- function test1() {
- var a = 2;
- alert(a);
- }
- test1();// 2
这里的函数中的定义的 a 是局部变量, 它的作用域为函数 {} 之间, 函数外定义的 a 为全局变量, 它的作用域为整个程序(描述有点不准确). 在函数中的局部变量和全局变量重名, 局部变量会覆盖全局变量.
二, 提到全局变量与局部变量不得不说明的一个知识点就是变量提升.'与 C/C++ 逐行执行代码不同, JS 引擎的工作方式是, 先获取所有被声明的变量再逐一执行, 所有变量的声明语句都会被提升到当前代码块的头部'. 注: 代码块指的是 function 的一个 {}, 通常的 if,while,for 的{} 中变量不会提升.
了解了变量提升了之后我们用以下代码来演示:
- var a = 1;
- function test1() {
- alert(a);
- var a = 2;
- alert(a);
- }
- test1();
- alert(a);//undefined 2 1
为什么结果不是 1 2 1 呢? 原因就在于代码提升. 由于代码提升的效果所以实际执行的代码是这样的:
- var a = 1;
- function test1() {
- var a;// 局部变量与全局变量重名时会覆盖全局变量, 此时的 a 只有声明却未定义
- alert(a);// 所以执行 alert 值为 undefined
- a = 2;
- }
- test1();
- alert(a);//undefined 2
来源: http://www.qdfuns.com/article/51117/e094666dd6cafe5ac710275903320291.html